1. Introducción

Workflows es un servicio de organización completamente administrado que ejecuta servicios externos o de Google Cloud en el orden que definas.
BigQuery es un almacén de datos empresarial completamente administrado que te ayuda a administrar y analizar terabytes de datos con funciones integradas como el aprendizaje automático, el análisis geoespacial y la inteligencia empresarial.
En este codelab, ejecutarás algunas consultas de BigQuery en el conjunto de datos públicos de Wikipedia. Luego, verás cómo ejecutar varias consultas de BigQuery una tras otra de forma serial, como parte de una orquestación de Workflows. Por último, paralelizarás las consultas con la función de iteración paralela de Workflows para mejorar la velocidad hasta 5 veces.
Qué aprenderás
- Cómo ejecutar consultas de BigQuery en el conjunto de datos de Wikipedia
- Cómo ejecutar varias consultas como parte de una organización de Workflows de forma serial
- Cómo paralelizar consultas con la iteración paralela de Workflows para mejorar la velocidad hasta 5 veces
2. Configuración y requisitos
Cómo configurar el entorno a tu propio ritmo
- Accede a Google Cloud Console y crea un proyecto nuevo o reutiliza uno existente. Si aún no tienes una cuenta de Gmail o de Google Workspace, debes crear una.



- El Nombre del proyecto es el nombre visible de los participantes de este proyecto. Es una cadena de caracteres que no se utiliza en las APIs de Google. Puedes actualizarla en cualquier momento.
- El ID del proyecto debe ser único en todos los proyectos de Google Cloud y es inmutable (no se puede cambiar después de configurarlo). La consola de Cloud genera automáticamente una cadena única. Por lo general, no importa cuál sea. En la mayoría de los codelabs, deberás hacer referencia al ID del proyecto (suele identificarse como
PROJECT_ID). Si no te gusta el ID que se generó, podrías generar otro aleatorio. También puedes probar uno propio y ver si está disponible. No se puede cambiar después de este paso y se usará el mismo durante todo el proyecto. - Recuerda que hay un tercer valor, un número de proyecto, que usan algunas APIs. Obtén más información sobre estos tres valores en la documentación.
- A continuación, deberás habilitar la facturación en la consola de Cloud para usar las APIs o los recursos de Cloud. Ejecutar este codelab no debería costar mucho, tal vez nada. Para cerrar recursos y evitar que se generen cobros más allá de este instructivo, puedes borrar los recursos que creaste o borrar todo el proyecto. Los usuarios nuevos de Google Cloud son aptos para participar en el programa Prueba gratuita de USD 300.
Inicia Cloud Shell
Si bien Google Cloud y Spanner se pueden operar de manera remota desde tu laptop, en este codelab usarás Google Cloud Shell, un entorno de línea de comandos que se ejecuta en la nube.
En Google Cloud Console, haz clic en el ícono de Cloud Shell en la barra de herramientas en la parte superior derecha:

El aprovisionamiento y la conexión al entorno deberían tomar solo unos minutos. Cuando termine el proceso, debería ver algo como lo siguiente:

Esta máquina virtual está cargada con todas las herramientas de desarrollo que necesitarás. Ofrece un directorio principal persistente de 5 GB y se ejecuta en Google Cloud, lo que permite mejorar considerablemente el rendimiento de la red y la autenticación. Todo tu trabajo en este codelab se puede hacer en un navegador. No es necesario que instales nada.
3. Explora el conjunto de datos de Wikipedia
Primero, explora el conjunto de datos de Wikipedia en BigQuery.
Ve a la sección BigQuery de la consola de Google Cloud:

En bigquery-samples, deberías ver varios conjuntos de datos públicos, incluidos algunos relacionados con Wikipedia:

En el conjunto de datos wikipedia_pageviews, puedes ver varias tablas de vistas de página de diferentes años:

Puedes seleccionar una de las tablas (p. ej., 201207) y obtén una vista previa de los datos:

También puedes ejecutar consultas en la tabla. Por ejemplo, esta consulta selecciona los 100 títulos con más vistas:
SELECT TITLE, SUM(views) FROM bigquery-samples.wikipedia_pageviews.201207h GROUP BY TITLE ORDER BY SUM(VIEWS) DESC LIMIT 100
Una vez que ejecutes la consulta, tardará unos 20 segundos en cargar los datos:

4. Define un flujo de trabajo para ejecutar varias consultas
Ejecutar una consulta en una sola tabla es sencillo. Sin embargo, ejecutar varias consultas en varias tablas y recopilar los resultados puede ser bastante tedioso. Para ayudarte con esto, Workflows puede usar su sintaxis de iteración.
Dentro de Cloud Shell, crea un archivo workflow-serial.yaml para compilar un flujo de trabajo que ejecute varias consultas en varias tablas:
touch workflow-serial.yaml
Luego, puedes editar el archivo con el editor en Cloud Shell:

Dentro del archivo workflow-serial.yaml, en el primer paso init, crea un mapa results para hacer un seguimiento de cada iteración con los nombres de las tablas como claves. También define un array tables con la lista de tablas en las que deseas ejecutar consultas. En este caso, elegimos 5 tablas:
main:
steps:
- init:
assign:
- results : {}
- tables:
- 201201h
- 201202h
- 201203h
- 201204h
- 201205h
A continuación, define un paso runQueries. En este paso, se itera sobre cada tabla y se usa el conector de BigQuery de Workflows para ejecutar una consulta que encuentre los 100 títulos principales con más vistas de página en cada tabla. Luego, guarda el título y las vistas principales de cada tabla en el 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}
En el último paso, devuelve el mapa results:
- returnResults:
return: ${results}
5. Ejecuta varias consultas con Workflows
Antes de implementar y ejecutar el flujo de trabajo, debes asegurarte de que la API de Workflows esté habilitada. Puedes habilitarlo desde Google Cloud Console o con gcloud en Cloud Shell:
gcloud services enable workflows.googleapis.com
Crea una cuenta de servicio para Workflows:
SERVICE_ACCOUNT=workflows-bigquery-sa gcloud iam service-accounts create $SERVICE_ACCOUNT \ --display-name="Workflows BigQuery service account"
Asegúrate de que la cuenta de servicio tenga los roles para registrar y ejecutar trabajos de 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
Implementa el flujo de trabajo con la cuenta de servicio:
gcloud workflows deploy bigquery-serial \
--source=workflow-serial.yaml \
--service-account=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com
Por último, ya puedes ejecutar el flujo de trabajo.
Busca el flujo de trabajo bigquery-serial en la sección Workflows de la consola de Cloud y presiona el botón Execute:

Como alternativa, también puedes ejecutar el flujo de trabajo con gcloud en Cloud Shell:
gcloud workflows run bigquery-serial
Deberías ver que la ejecución del flujo de trabajo dura aproximadamente 1 minuto (20 segundos para cada una de las 5 tablas).
Al final, verás el resultado de cada tabla con los títulos y las vistas principales:


6. Paraleliza varias consultas con pasos paralelos
El flujo de trabajo del paso anterior tardó alrededor de 1 minuto porque ejecutó 5 consultas que tardaron 20 segundos cada una. Como se trata de consultas independientes, puedes ejecutarlas en paralelo con la función de iteración paralela de Workflows.
Copia el archivo workflow-serial.yaml en un archivo workflow-parallel.yaml nuevo. En el archivo nuevo, realizarás algunos cambios para convertir los pasos secuenciales en pasos paralelos.
En el archivo workflow-parallel.yaml, cambia el paso runQueries. Primero, agrega la palabra clave parallel. Esto permite que cada iteración del bucle for se ejecute en paralelo. En segundo lugar, declara la variable results como una variable shared. Esto permite que una rama escriba la variable. Agregaremos cada resultado a esta variable.
- runQueries:
parallel:
shared: [results]
for:
value: table
in: ${tables}
Implementa el flujo de trabajo paralelo:
gcloud workflows deploy bigquery-parallel \
--source=workflow-parallel.yaml \
--service-account=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com
Ejecuta el flujo de trabajo:
gcloud workflows run bigquery-parallel
Deberías ver que la ejecución del flujo de trabajo dura unos 20 segundos. Esto se debe a que las 5 consultas se ejecutan en paralelo. Mejora de la velocidad de hasta 5 veces con solo un par de líneas de código.
Al final, verás el mismo resultado de cada tabla con los títulos y las vistas principales, pero con un tiempo de ejecución mucho más corto:

7. Felicitaciones
¡Felicitaciones! Completaste el codelab. Para obtener más información, consulta la documentación de Workflows sobre los pasos paralelos.
Temas abordados
- Cómo ejecutar consultas de BigQuery en el conjunto de datos de Wikipedia
- Cómo ejecutar varias consultas como parte de una organización de Workflows de forma serial
- Cómo paralelizar consultas con la iteración paralela de Workflows para mejorar la velocidad hasta 5 veces