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 Google Cloud o servicios externos 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 aprendizaje automático, inteligencia empresarial y análisis geoespacial.

En este codelab, ejecutarás algunas consultas de BigQuery con 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 organización de Workflows. Por último, paraleliza las consultas con la función de iteración paralela de Workflows para lograr una mejora de velocidad hasta 5 veces mayor.

Qué aprenderás

  • Cómo ejecutar consultas de BigQuery con el conjunto de datos de Wikipedia
  • Cómo ejecutar varias consultas como parte de una organización de Workflows en serie
  • Cómo paralelizar consultas con la iteración paralela de Workflows para lograr una mejora de velocidad hasta 5 veces mayor

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 te importa qué es. En la mayoría de los codelabs, deberás hacer referencia al ID del proyecto (por lo general, se identifica como PROJECT_ID). Si no te gusta el ID generado, puedes generar otro aleatorio. También puedes probar el tuyo propio y ver si está disponible. No se puede cambiar después de este paso y se mantendrá mientras dure el proyecto.
  • Para tu información, 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 te facture 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 Google Cloud Console:

ea75ab12a7c012a4.png

En bigquery-samples, deberías ver varios conjuntos de datos públicos, incluidos algunos conjuntos de datos 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 principales 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, los datos tardan unos 20 segundos en cargarse:

1df3877aed1653b4.png

4. Define un flujo de trabajo para ejecutar varias consultas

Ejecutar una consulta en una sola tabla es fácil. Sin embargo, ejecutar varias consultas en varias tablas y recopilar los resultados puede ser bastante tedioso. Para ayudar con esto, Workflows puede ayudar con 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 de init, crea un mapa de results para realizar un seguimiento de cada iteración con clave por nombre de tabla. Además, define un array tables con la lista de tablas en las que deseas ejecutar consultas. En este caso, elegiremos 5 tablas:

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

A continuación, define un paso runQueries. Este paso se itera en cada tabla y usa los flujos de trabajo Conector de BigQuery para ejecutar una consulta y encontrar 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 paso final, muestra el mapa results:

    - returnResults:
        return: ${results}

5. Ejecuta varias consultas con Workflows

Antes de que puedas implementar y ejecutar el flujo de trabajo, debes asegurarte de que la API de Workflows esté habilitada. Puedes habilitarlo desde la consola de Google Cloud 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 necesarios 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 tienes todo listo para 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 alrededor de 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 más populares:

304d11a5bffdada4.png

baf31533d3671c9e.png

6. Paraleliza varias consultas con pasos paralelos

El flujo de trabajo del paso anterior tardó alrededor de 1 minuto porque ejecutaba 5 consultas que tardaron 20 segundos cada una. Dado que estas son 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 un par de cambios para convertir los pasos en serie 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. Luego, declara la variable results como una variable shared. Esto permite que una rama pueda escribir en 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 hasta 5 veces la velocidad con solo un par de líneas de cambio.

Al final, verás el mismo resultado de cada tabla con títulos y 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 con el conjunto de datos de Wikipedia
  • Cómo ejecutar varias consultas como parte de una organización de Workflows en serie
  • Cómo paralelizar consultas con la iteración paralela de Workflows para lograr una mejora de velocidad hasta 5 veces mayor