1. Introdução

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
- 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.



- 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.
- 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:

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:

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:

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

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

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

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:

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:

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:

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:


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:

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.