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 definida por você.

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

Neste codelab, você vai executar algumas consultas do BigQuery no conjunto de dados público da Wikipédia. Em seguida, você vai aprender a executar várias consultas do BigQuery em sequência, de forma serial, como parte de uma orquestração do Workflows. Por fim, você vai paralelizar as consultas usando o recurso de iteração paralela do Workflows para melhorar a velocidade em até 5 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 paralelizar consultas usando a iteração paralela do Workflows para melhorar a velocidade em até 5 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 É possível atualizar o local 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. Em geral, não importa o que seja. Na maioria dos codelabs, é necessário fazer referência ao ID do projeto, normalmente identificado como PROJECT_ID. Se você não gostar do ID gerado, crie outro aleatório. Se preferir, teste o seu e confira se ele está disponível. Ele não pode ser mudado após essa etapa e permanece durante o projeto.
  • Para sua informação, há um terceiro valor, um Número do 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 evitar cobranças além deste tutorial, exclua os recursos criados ou 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. Analisar o conjunto de dados da Wikipédia

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

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

ea75ab12a7c012a4.png

Em bigquery-samples, você vai encontrar vários conjuntos de dados públicos, incluindo alguns relacionados à Wikipedia:

c9484e305b8e1438.png

No conjunto de dados wikipedia_pageviews, você encontra várias tabelas de visualizações de página de diferentes anos:

c540a4162640cbb3.png

Selecione uma das tabelas (por exemplo, 201207) e visualize os dados:

b5b2a334cd6f63c0.png

Também é possível executar consultas na tabela. Por exemplo, esta consulta seleciona os 100 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

Depois de executar 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 várias tabelas e reunir os resultados pode ser bastante cansativo. Para ajudar com isso, o Workflows pode usar a sintaxe de iteração.

No Cloud Shell, crie um arquivo workflow-serial.yaml para criar um fluxo de trabalho que execute 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 com chaves pelos nomes das tabelas. Defina também uma matriz tables com a lista de tabelas em que você quer executar consultas. Neste caso, vamos escolher cinco tabelas:

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

Em seguida, defina uma etapa runQueries. Esta etapa itera em cada tabela e usa o conector do BigQuery dos fluxos de trabalho 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, verifique se a API Workflows está ativada. É possível ativar no Console do Google Cloud ou usando gcloud no Cloud Shell:

gcloud services enable workflows.googleapis.com

Crie uma conta de serviço para os fluxos de trabalho:

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, tudo está 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 clique no botão Execute:

b6afa4747680334f.png

Como alternativa, execute o fluxo de trabalho com gcloud no Cloud Shell:

gcloud workflows run bigquery-serial

A execução do fluxo de trabalho vai durar cerca de um minuto (20 segundos para cada uma das cinco tabelas).

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

304d11a5bffdada4.png

baf31533d3671c9e.png

6. Paralelizar várias consultas com etapas paralelas

O fluxo de trabalho na etapa anterior levou cerca de 1 minuto porque executou cinco consultas que levaram 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ê fará algumas mudanças para transformar as etapas em série em etapas paralelas.

No arquivo workflow-parallel.yaml, mude a etapa runQueries. Primeiro, adicione a palavra-chave parallel. Isso permite que cada iteração do loop for seja executada em paralelo. Em seguida, declare a variável results como uma variável shared. Isso permite que a variável seja gravável por uma ramificação. Vamos adicionar cada resultado ao final dessa 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 vai durar cerca de 20 segundos. Isso acontece porque as cinco consultas são executadas em paralelo. Melhoria de velocidade de até 5 vezes com apenas algumas linhas de mudança de código.

No final, você vai encontrar a mesma saída 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, consulte 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 paralelizar consultas usando a iteração paralela do Workflows para melhorar a velocidade em até 5 vezes.