Como executar jobs do BigQuery em paralelo com o Workflows

1. Introdução

1c05e3d0c2bd2b45.png 74be7b376d45258a.png

O Workflows é um serviço de orquestração totalmente gerenciado que executa serviços externos ou do Google Cloud na ordem que você definir.

O BigQuery é um data warehouse corporativo totalmente gerenciado que ajuda a administrar e analisar terabytes de dados com recursos integrados, como machine learning, análise geoespacial e Business Intelligence.

Neste codelab, você executará algumas consultas do BigQuery no conjunto de dados público da Wikipédia. Depois você vai aprender a executar várias consultas do BigQuery, uma após a outra, em série, como parte de uma orquestração do Workflows. Por fim, você vai carregar as consultas em paralelo usando o recurso de iteração paralela do Workflows para melhorar a velocidade em até cinco vezes.

O que você vai aprender

  • Como executar consultas do BigQuery no conjunto de dados da Wikipédia.
  • Como executar várias consultas em série como parte de uma orquestração do Workflows.
  • Como carregar consultas em paralelo usando a iteração paralela do Workflows para melhorar a velocidade em até cinco vezes.

2. Configuração e requisitos

Configuração de ambiente personalizada

  1. Faça login no Console do Google Cloud e crie um novo projeto ou reutilize um existente. Crie uma conta do Gmail ou do Google Workspace, se ainda não tiver uma.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • O Nome do projeto é o nome de exibição para os participantes do projeto. É uma string de caracteres não usada pelas APIs do Google Você pode atualizar a qualquer momento.
  • O ID do projeto precisa ser exclusivo em todos os projetos do Google Cloud e não pode ser alterado após a definição. O console do Cloud gera automaticamente uma string exclusiva. normalmente você não se importa com o que seja. Na maioria dos codelabs, é necessário fazer referência ao ID do projeto, que normalmente é identificado como PROJECT_ID. Se você não gostar do ID gerado, poderá gerar outro ID aleatório. Como alternativa, você pode tentar o seu próprio e ver se ele está disponível. Ela não pode ser alterada após essa etapa e permanecerá durante a duração do projeto.
  • Para sua informação, há um terceiro valor, um Número de projeto, que algumas APIs usam. Saiba mais sobre esses três valores na documentação.
  1. Em seguida, ative o faturamento no console do Cloud para usar os recursos/APIs do Cloud. A execução deste codelab não será muito cara, se tiver algum custo. Para encerrar os recursos e não gerar faturamento além deste tutorial, exclua os recursos criados ou exclua o projeto inteiro. Novos usuários do Google Cloud estão qualificados para o programa de US$ 300 de avaliação sem custos.

Iniciar o Cloud Shell

Embora o Google Cloud e o Spanner possam ser operados remotamente do seu laptop, neste codelab usaremos o Google Cloud Shell, um ambiente de linha de comando executado no Cloud.

No Console do Google Cloud, clique no ícone do Cloud Shell na barra de ferramentas superior à direita:

55efc1aaa7a4d3ad.png

O provisionamento e a conexão com o ambiente levarão apenas alguns instantes para serem concluídos: Quando o processamento for concluído, você verá algo como:

7ffe5cbb04455448.png

Essa máquina virtual contém todas as ferramentas de desenvolvimento necessárias. Ela oferece um diretório principal persistente de 5 GB, além de ser executada no Google Cloud. Isso aprimora o desempenho e a autenticação da rede. Neste codelab, todo o trabalho pode ser feito com um navegador. Você não precisa instalar nada.

3. Analise o conjunto de dados da Wikipédia

Primeiro, analise o conjunto de dados da Wikipédia no BigQuery.

Acesse a seção BigQuery do console do Google Cloud:

ea75ab12a7c012a4.png

Em bigquery-samples, você verá vários conjuntos de dados públicos, incluindo alguns relacionados à Wikipédia:

c9484e305b8e1438.png

No conjunto de dados wikipedia_pageviews, é possível ver várias tabelas para visualizações de páginas de diferentes anos:

c540a4162640cbb3.png

Você pode selecionar uma das tabelas (por exemplo, 201207) e confira uma prévia dos dados:

b5b2a334cd6f63c0.png

Você também pode executar consultas na tabela. Por exemplo, esta consulta seleciona os 100 principais títulos com mais visualizações:

SELECT TITLE, SUM(views)
FROM bigquery-samples.wikipedia_pageviews.201207h
GROUP BY TITLE
ORDER BY SUM(VIEWS) DESC
LIMIT 100

A consulta leva cerca de 20 segundos para carregar os dados:

1df3877aed1653b4.png

4. Definir um fluxo de trabalho para executar várias consultas

É fácil executar uma consulta em uma única tabela. No entanto, executar várias consultas em diversas tabelas e reunir os resultados pode ser uma tarefa entediante. Para ajudar com isso, o Workflows pode ajudar com a sintaxe de iteração.

No Cloud Shell, crie um arquivo workflow-serial.yaml para gerar um fluxo de trabalho e executar várias consultas em várias tabelas:

touch workflow-serial.yaml

Em seguida, edite o arquivo com o editor no Cloud Shell:

33bf9325b078ad8.png

No arquivo workflow-serial.yaml, na primeira etapa init, crie um mapa results para acompanhar cada iteração codificada por nomes de tabela. Defina também uma matriz tables com a lista de tabelas em que você quer executar consultas. Neste caso, escolhemos cinco tabelas:

main:
    steps:
    - init:
        assign:
            - results : {}
            - tables:
                - 201201h
                - 201202h
                - 201203h
                - 201204h
                - 201205h

Em seguida, defina uma etapa runQueries. Essa etapa itera em cada tabela e usa o Conector do BigQuery para executar uma consulta e encontrar os 100 principais títulos com mais visualizações de página em cada tabela. Em seguida, ele salva o título e as visualizações principais de cada tabela no mapa de resultados:

    - runQueries:
        for:
            value: table
            in: ${tables}
            steps:
            - runQuery:
                call: googleapis.bigquery.v2.jobs.query
                args:
                    projectId: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
                    body:
                        useLegacySql: false
                        useQueryCache: false
                        timeoutMs: 30000
                        # Find the top 100 titles with most views on Wikipedia
                        query: ${
                            "SELECT TITLE, SUM(views)
                            FROM `bigquery-samples.wikipedia_pageviews." + table + "`
                            WHERE LENGTH(TITLE) > 10
                            GROUP BY TITLE
                            ORDER BY SUM(VIEWS) DESC
                            LIMIT 100"
                            }
                result: queryResult
            - returnResult:
                assign:
                    # Return the top title from each table
                    - results[table]: {}
                    - results[table].title: ${queryResult.rows[0].f[0].v}
                    - results[table].views: ${queryResult.rows[0].f[1].v}

Na etapa final, retorne o mapa results:

    - returnResults:
        return: ${results}

5. Executar várias consultas com o Workflows

Antes de implantar e executar o fluxo de trabalho, você precisa verificar se a API Workflows está ativada. É possível ativá-lo no Console do Google Cloud ou usando gcloud no Cloud Shell:

gcloud services enable workflows.googleapis.com

Crie uma conta de serviço para o Workflows:

SERVICE_ACCOUNT=workflows-bigquery-sa
gcloud iam service-accounts create $SERVICE_ACCOUNT \
  --display-name="Workflows BigQuery service account"

Verifique se a conta de serviço tem os papéis para registrar e executar jobs do BigQuery:

PROJECT_ID=your-project-id
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --role roles/logging.logWriter \
  --role roles/bigquery.jobUser \
  --member serviceAccount:$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

Implante o fluxo de trabalho com a conta de serviço:

gcloud workflows deploy bigquery-serial \
    --source=workflow-serial.yaml \
    --service-account=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

Por fim, está tudo pronto para executar o fluxo de trabalho.

Encontre o fluxo de trabalho bigquery-serial na seção "Fluxos de trabalho" do Console do Cloud e pressione o botão Execute:

b6afa4747680334f.png

Como alternativa, também é possível executar o fluxo de trabalho com gcloud no Cloud Shell:

gcloud workflows run bigquery-serial

A execução do fluxo de trabalho deve durar cerca de 1 minuto (20 segundos para cada uma das 5 tabelas).

No final, você verá a saída de cada tabela com os principais títulos e visualizações:

304d11a5bffdada4.png

baf31533d3671c9e.png

6. Carregar várias consultas em paralelo com etapas paralelas

O fluxo de trabalho na etapa anterior demorou cerca de 1 minuto porque executou 5 consultas com 20 segundos cada. Como essas são consultas independentes, é possível executá-las em paralelo usando o recurso de iteração paralela do Workflows.

Copie o arquivo workflow-serial.yaml para um novo arquivo workflow-parallel.yaml. No novo arquivo, você vai fazer algumas mudanças para transformar as etapas seriais em paralelas.

No arquivo workflow-parallel.yaml, mude a etapa runQueries. Primeiro, adicione a palavra-chave parallel. Isso permite que cada iteração da repetição "for" seja executada em paralelo. Segundo, declare a variável results como shared. Isso permite que a variável seja gravável por uma ramificação. Vamos anexar cada resultado a essa variável.

- runQueries:
    parallel:
        shared: [results]
        for:
            value: table
            in: ${tables}

Implante o fluxo de trabalho paralelo:

gcloud workflows deploy bigquery-parallel \
    --source=workflow-parallel.yaml \
    --service-account=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

Execute o fluxo de trabalho:

gcloud workflows run bigquery-parallel

A execução do fluxo de trabalho deve durar cerca de 20 segundos. Isso ocorre porque todas as cinco consultas são executadas em paralelo. Melhoria de até cinco vezes na velocidade com apenas algumas linhas de mudança de código.

No final, você vai encontrar o mesmo resultado de cada tabela com os principais títulos e visualizações, mas com um tempo de execução muito menor:

1825d49ef225c828.png

7. Parabéns

Parabéns, você concluiu o codelab. Para saber mais, confira a documentação do Workflows sobre etapas paralelas.

O que aprendemos

  • Como executar consultas do BigQuery no conjunto de dados da Wikipédia.
  • Como executar várias consultas em série como parte de uma orquestração do Workflows.
  • Como carregar consultas em paralelo usando a iteração paralela do Workflows para melhorar a velocidade em até cinco vezes.