Exécuter des jobs BigQuery en parallèle de Workflows

1. Introduction

1c05e3d0c2bd2b45.png 74be7b376d45258a.png

Workflows est un service d'orchestration entièrement géré qui exécute des services Google Cloud ou externes dans l'ordre que vous définissez.

BigQuery est un entrepôt de données d'entreprise entièrement géré qui vous aide à gérer et à analyser des téraoctets de données grâce à des fonctionnalités intégrées telles que le machine learning, l'analyse géospatiale et l'informatique décisionnelle.

Dans cet atelier de programmation, vous allez exécuter des requêtes BigQuery sur l'ensemble de données public Wikipédia. Vous verrez ensuite comment exécuter plusieurs requêtes BigQuery les unes après les autres, en série, dans le cadre d'une orchestration de workflows. Enfin, vous allez charger les requêtes en parallèle à l'aide de la fonctionnalité d'itération parallèle de Workflows pour multiplier la vitesse par cinq.

Points abordés

  • Exécuter des requêtes BigQuery sur l'ensemble de données Wikipédia
  • Exécuter plusieurs requêtes en série dans le cadre d'une orchestration de workflows
  • Comment charger des requêtes en parallèle à l'aide de l'itération parallèle de Workflows pour multiplier la vitesse par cinq

2. Préparation

Configuration de l'environnement d'auto-formation

  1. Connectez-vous à la console Google Cloud, puis créez un projet ou réutilisez un projet existant. (Si vous ne possédez pas encore de compte Gmail ou Google Workspace, vous devez en créer un.)

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Le nom du projet est le nom à afficher pour les participants au projet. Il s'agit d'une chaîne de caractères non utilisée par les API Google. Vous pouvez le modifier à tout moment.
  • L'ID du projet doit être unique sur l'ensemble des projets Google Cloud et doit être immuable (vous ne pouvez pas le modifier une fois que vous l'avez défini). La console Cloud génère automatiquement une chaîne unique. généralement, vous ne vous souciez pas de ce que c’est. Dans la plupart des ateliers de programmation, vous devrez référencer l'ID du projet (il est généralement identifié comme PROJECT_ID). Si l'ID généré ne vous convient pas, vous pouvez en générer un autre au hasard. Vous pouvez également essayer la vôtre pour voir si elle est disponible. Il ne peut pas être modifié après cette étape et restera actif pendant toute la durée du projet.
  • Pour votre information, il existe une troisième valeur, le numéro de projet, utilisé par certaines API. Pour en savoir plus sur ces trois valeurs, consultez la documentation.
  1. Vous devez ensuite activer la facturation dans la console Cloud pour utiliser les ressources/API Cloud. L'exécution de cet atelier de programmation est très peu coûteuse, voire sans frais. Pour arrêter les ressources afin d'éviter que des frais ne vous soient facturés au-delà de ce tutoriel, vous pouvez supprimer les ressources que vous avez créées ou l'ensemble du projet. Les nouveaux utilisateurs de Google Cloud peuvent participer au programme d'essai gratuit pour bénéficier d'un crédit de 300 $.

Démarrer Cloud Shell

Bien que Google Cloud puisse être utilisé à distance depuis votre ordinateur portable, nous allons nous servir de Google Cloud Shell pour cet atelier de programmation, un environnement de ligne de commande exécuté dans le cloud.

Dans la console Google Cloud, cliquez sur l'icône Cloud Shell dans la barre d'outils supérieure :

55efc1aaa7a4d3ad.png

Le provisionnement et la connexion à l'environnement prennent quelques instants seulement. Une fois l'opération terminée, le résultat devrait ressembler à ceci :

7ffe5cbb04455448.png

Cette machine virtuelle contient tous les outils de développement nécessaires. Elle comprend un répertoire d'accueil persistant de 5 Go et s'exécute sur Google Cloud, ce qui améliore nettement les performances du réseau et l'authentification. Vous pouvez effectuer toutes les tâches de cet atelier de programmation dans un navigateur. Vous n'avez rien à installer.

3. Explorer l'ensemble de données Wikipédia

Tout d'abord, explorez l'ensemble de données Wikipédia dans BigQuery.

Accédez à la section BigQuery de la console Google Cloud:

ea75ab12a7c012a4.png

Sous bigquery-samples, vous devriez voir divers ensembles de données publics, y compris des ensembles de données liés à Wikipédia:

c9484e305b8e1438.png

Sous l'ensemble de données wikipedia_pageviews, vous pouvez voir plusieurs tables pour les pages vues de différentes années:

c540a4162640cbb3.png

Vous pouvez sélectionner l'une des tables (par exemple, 201207) et prévisualisez les données:

b5b2a334cd6f63c0.png

Vous pouvez également exécuter des requêtes sur la table. Par exemple, la requête suivante sélectionne les 100 titres comptant le plus de vues:

SELECT TITLE, SUM(views)
FROM bigquery-samples.wikipedia_pageviews.201207h
GROUP BY TITLE
ORDER BY SUM(VIEWS) DESC
LIMIT 100

Une fois la requête exécutée, le chargement des données prend environ 20 secondes:

1df3877aed1653b4.png

4. Définir un workflow pour exécuter plusieurs requêtes

Il est facile d'exécuter une requête sur une seule table. Cependant, exécuter plusieurs requêtes sur plusieurs tables et rassembler les résultats peut s'avérer assez fastidieux. Pour vous aider, Workflows peut vous aider avec sa syntaxe d'itération.

Dans Cloud Shell, créez un fichier workflow-serial.yaml pour créer un workflow permettant d'exécuter plusieurs requêtes sur plusieurs tables:

touch workflow-serial.yaml

Vous pouvez ensuite modifier le fichier à l'aide de l'éditeur dans Cloud Shell:

33bf9325b078ad8.png

Dans le fichier workflow-serial.yaml, à la première étape init, créez une carte results pour suivre chaque itération associée par les noms de table. Définissez également un tableau tables avec la liste des tables sur lesquelles vous souhaitez exécuter des requêtes. Dans ce cas, nous choisissons cinq tables:

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

Ensuite, définissez une étape runQueries. Cette étape effectue une itération sur chaque table et utilise la méthode Workflows Connecteur BigQuery pour exécuter une requête permettant de trouver les 100 titres comptant le plus de pages vues dans chaque table. Il enregistre ensuite le titre principal et les vues de chaque tableau dans la carte des résultats:

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

À la dernière étape, renvoyez la carte results:

    - returnResults:
        return: ${results}

5. Exécuter plusieurs requêtes avec Workflows

Avant de pouvoir déployer et exécuter le workflow, vous devez vous assurer que l'API Workflows est activée. Vous pouvez l'activer depuis la console Google Cloud ou en utilisant gcloud dans Cloud Shell:

gcloud services enable workflows.googleapis.com

Créez un compte de service pour Workflows:

SERVICE_ACCOUNT=workflows-bigquery-sa
gcloud iam service-accounts create $SERVICE_ACCOUNT \
  --display-name="Workflows BigQuery service account"

Assurez-vous que le compte de service dispose des rôles nécessaires pour consigner et exécuter les tâches 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

Déployez le workflow avec le compte de service:

gcloud workflows deploy bigquery-serial \
    --source=workflow-serial.yaml \
    --service-account=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

Enfin, vous êtes prêt à exécuter le workflow.

Recherchez le workflow bigquery-serial dans la section "Workflows" de Cloud Console, puis cliquez sur le bouton Execute:

b6afa4747680334f.png

Vous pouvez également exécuter le workflow avec gcloud dans Cloud Shell:

gcloud workflows run bigquery-serial

L'exécution du workflow devrait durer environ une minute (20 secondes pour chacune des cinq tables).

À la fin, vous verrez le résultat de chaque table avec les titres et les vues les plus importants:

304d11a5bffdada4.png

baf31533d3671c9e.png

6. Mettre en parallèle plusieurs requêtes à l'aide d'étapes parallèles

Le workflow de l'étape précédente a pris environ une minute, car il a exécuté cinq requêtes d'une durée de 20 secondes chacune. Comme il s'agit de requêtes indépendantes, vous pouvez les exécuter en parallèle à l'aide de la fonctionnalité d'itération parallèle de Workflows.

Copiez le fichier workflow-serial.yaml dans un nouveau fichier workflow-parallel.yaml. Dans le nouveau fichier, vous allez effectuer quelques modifications pour transformer les étapes en série en étapes parallèles.

Dans le fichier workflow-parallel.yaml, modifiez l'étape runQueries. Tout d'abord, ajoutez le mot clé parallel. Cela permet à chaque itération de la boucle For de s'exécuter en parallèle. Ensuite, déclarez la variable results en tant que variable shared. Cela permet à une branche d'être accessible en écriture à la variable. Nous ajouterons chaque résultat à cette variable.

- runQueries:
    parallel:
        shared: [results]
        for:
            value: table
            in: ${tables}

Déployez le workflow parallèle:

gcloud workflows deploy bigquery-parallel \
    --source=workflow-parallel.yaml \
    --service-account=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

Exécutez le workflow comme suit :

gcloud workflows run bigquery-parallel

L'exécution du workflow devrait durer environ 20 secondes. Cela est dû au fait que les cinq requêtes s'exécutent en parallèle. Jusqu'à cinq fois plus rapide avec seulement quelques lignes de code !

Au final, vous obtenez le même résultat pour chaque table avec les titres et les vues les plus importants, mais avec un temps d'exécution beaucoup plus court:

1825d49ef225c828.png

7. Félicitations

Félicitations, vous avez terminé cet atelier de programmation. Pour en savoir plus, consultez la documentation sur les workflows sur les étapes parallèles.

Points abordés

  • Exécuter des requêtes BigQuery sur l'ensemble de données Wikipédia
  • Exécuter plusieurs requêtes en série dans le cadre d'une orchestration de workflows
  • Comment charger des requêtes en parallèle à l'aide de l'itération parallèle de Workflows pour une vitesse jusqu'à cinq fois supérieure