Ejecuta trabajos de BigQuery en paralelo con Workflows

1. Introducción

1c05e3d0c2bd2b45.png 74be7b376d45258a.png

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

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

55efc1aaa7a4d3ad.png

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:

7ffe5cbb04455448.png

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:

ea75ab12a7c012a4.png

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

c9484e305b8e1438.png

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

c540a4162640cbb3.png

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

b5b2a334cd6f63c0.png

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:

1df3877aed1653b4.png

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:

33bf9325b078ad8.png

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:

b6afa4747680334f.png

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:

304d11a5bffdada4.png

baf31533d3671c9e.png

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:

1825d49ef225c828.png

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