Mehrere BigQuery-Jobs parallel ausführen


BigQuery hostet eine Reihe von öffentlichen Datasets, die von der Allgemeinheit abgefragt werden können. In dieser Anleitung erstellen Sie einen Workflow, der mehrere BigQuery-Abfragejobs parallel ausführt und so eine Leistungsverbesserung im Vergleich zur fortlaufenden Ausführung der Jobs darstellt.

Lernziele

In dieser Anleitung werden Sie:

  1. Führen Sie eine Abfrage für ein öffentliches Wikipedia-Dataset aus, um die in einem bestimmten Monat am häufigsten aufgerufenen Titel zu ermitteln.
  2. Einen Workflow bereitstellen und ausführen, der mehrere BigQuery-Abfragejobs nacheinander ausführt
  3. Einen Workflow bereitstellen und ausführen, der die BigQuery-Jobs mit paralleler Iteration ausführt und normale for-Schleifen parallel ausführt.

Sie können die folgenden Befehle in der Google Cloud Console oder über die Google Cloud CLI in Ihrem Terminal oder in Cloud Shell ausführen.

Kosten

In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:

Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen. Neuen Google Cloud-Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

Hinweise

Von Ihrer Organisation definierte Sicherheitsbeschränkungen verhindern möglicherweise, dass die folgenden Schritte ausgeführt werden. Informationen zur Fehlerbehebung finden Sie unter Anwendungen in einer eingeschränkten Google Cloud-Umgebung entwickeln.

Console

  1. Melden Sie sich bei Ihrem Google Cloud-Konto an. Wenn Sie mit Google Cloud noch nicht vertraut sind, erstellen Sie ein Konto, um die Leistungsfähigkeit unserer Produkte in der Praxis sehen und bewerten zu können. Neukunden erhalten außerdem ein Guthaben von 300 $, um Arbeitslasten auszuführen, zu testen und bereitzustellen.
  2. Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  3. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.

  4. Workflows API aktivieren.

    Aktivieren Sie die API

  5. Erstellen Sie ein Dienstkonto:

    1. Wechseln Sie in der Google Cloud Console zur Seite Dienstkonto erstellen.

      Zur Seite „Dienstkonto erstellen“
    2. Wählen Sie Ihr Projekt aus.
    3. Geben Sie im Feld Dienstkontoname einen Namen ein. Die Google Cloud Console füllt das Feld Dienstkonto-ID anhand dieses Namens aus.

      Geben Sie im Feld Dienstkontobeschreibung eine Beschreibung ein. Beispiel: Service account for quickstart.

    4. Klicken Sie auf Erstellen und fortfahren.
    5. Weisen Sie dem Dienstkonto die folgenden Rollen zu: BigQuery > BigQuery Job User, Logging > Logs Writer.

      Wenn Sie eine Rolle zuweisen möchten, wählen Sie die Liste Rolle auswählen aus und wählen Sie die Rolle aus.

      Wenn Sie weitere Rollen hinzufügen möchten, klicken Sie auf Weitere Rolle hinzufügen und fügen Sie weitere Rollen hinzu.

    6. Klicken Sie auf Weiter.
    7. Klicken Sie auf Fertig, um das Erstellen des Dienstkontos abzuschließen.

  6. Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  7. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.

  8. Workflows API aktivieren.

    Aktivieren Sie die API

  9. Erstellen Sie ein Dienstkonto:

    1. Wechseln Sie in der Google Cloud Console zur Seite Dienstkonto erstellen.

      Zur Seite „Dienstkonto erstellen“
    2. Wählen Sie Ihr Projekt aus.
    3. Geben Sie im Feld Dienstkontoname einen Namen ein. Die Google Cloud Console füllt das Feld Dienstkonto-ID anhand dieses Namens aus.

      Geben Sie im Feld Dienstkontobeschreibung eine Beschreibung ein. Beispiel: Service account for quickstart.

    4. Klicken Sie auf Erstellen und fortfahren.
    5. Weisen Sie dem Dienstkonto die folgenden Rollen zu: BigQuery > BigQuery Job User, Logging > Logs Writer.

      Wenn Sie eine Rolle zuweisen möchten, wählen Sie die Liste Rolle auswählen aus und wählen Sie die Rolle aus.

      Wenn Sie weitere Rollen hinzufügen möchten, klicken Sie auf Weitere Rolle hinzufügen und fügen Sie weitere Rollen hinzu.

    6. Klicken Sie auf Weiter.
    7. Klicken Sie auf Fertig, um das Erstellen des Dienstkontos abzuschließen.

gcloud

  1. Melden Sie sich bei Ihrem Google-Konto an.

    Wenn Sie noch kein Konto haben, melden Sie sich hier für ein neues Konto an.

  2. Installieren Sie die Google Cloud CLI.
  3. Führen Sie folgenden Befehl aus, um die gcloud CLI zu initialisieren:

    gcloud init
  4. Google Cloud-Projekt erstellen oder auswählen.

    • Erstellen Sie ein Google Cloud-Projekt:

      gcloud projects create PROJECT_ID

      Ersetzen Sie PROJECT_ID durch einen Namen für das Google Cloud-Projekt, das Sie erstellen.

    • Wählen Sie das von Ihnen erstellte Google Cloud-Projekt aus:

      gcloud config set project PROJECT_ID

      Ersetzen Sie PROJECT_ID durch den Namen Ihres Google Cloud-Projekts.

  5. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.

  6. Aktivieren Sie die Workflows API:

    gcloud services enable workflows.googleapis.com
  7. Richten Sie die Authentifizierung ein:

    1. Erstellen Sie das Dienstkonto:

      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME

      Ersetzen Sie SERVICE_ACCOUNT_NAME mit einem Namen für das Dienstkonto.

    2. Weisen Sie dem Dienstkonto Rollen zu. Führen Sie den Befehl roles/bigquery.jobUser, roles/logging.logWriter für jede der folgenden IAM-Rollen einmal aus:

      gcloud projects add-iam-policy-binding PROJECT_ID --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" --role=ROLE

      Dabei gilt:

      • SERVICE_ACCOUNT_NAME: der Name des Dienstkontos
      • PROJECT_ID: die Projekt-ID, unter der Sie das Dienstkonto erstellt haben
      • ROLE: die zu gewährende Rolle
  8. Installieren Sie die Google Cloud CLI.
  9. Führen Sie folgenden Befehl aus, um die gcloud CLI zu initialisieren:

    gcloud init
  10. Google Cloud-Projekt erstellen oder auswählen.

    • Erstellen Sie ein Google Cloud-Projekt:

      gcloud projects create PROJECT_ID

      Ersetzen Sie PROJECT_ID durch einen Namen für das Google Cloud-Projekt, das Sie erstellen.

    • Wählen Sie das von Ihnen erstellte Google Cloud-Projekt aus:

      gcloud config set project PROJECT_ID

      Ersetzen Sie PROJECT_ID durch den Namen Ihres Google Cloud-Projekts.

  11. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.

  12. Aktivieren Sie die Workflows API:

    gcloud services enable workflows.googleapis.com
  13. Richten Sie die Authentifizierung ein:

    1. Erstellen Sie das Dienstkonto:

      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME

      Ersetzen Sie SERVICE_ACCOUNT_NAME mit einem Namen für das Dienstkonto.

    2. Weisen Sie dem Dienstkonto Rollen zu. Führen Sie den Befehl roles/bigquery.jobUser, roles/logging.logWriter für jede der folgenden IAM-Rollen einmal aus:

      gcloud projects add-iam-policy-binding PROJECT_ID --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" --role=ROLE

      Dabei gilt:

      • SERVICE_ACCOUNT_NAME: der Name des Dienstkontos
      • PROJECT_ID: die Projekt-ID, unter der Sie das Dienstkonto erstellt haben
      • ROLE: die zu gewährende Rolle

BigQuery-Abfragejob ausführen

In BigQuery können Sie einen interaktiven (On-Demand-)Abfragejob ausführen. Weitere Informationen finden Sie unter Interaktive Jobs und Batch-Abfragejobs ausführen.

Console

  1. Öffnen Sie in der Google Cloud Console die Seite BigQuery.

    BigQuery aufrufen

  2. Geben Sie die folgende BigQuery-SQL-Abfrage in den Textbereich des Abfrageeditors ein:

    SELECT TITLE, SUM(views)
    FROM `bigquery-samples.wikipedia_pageviews.201207h`
    GROUP BY TITLE
    ORDER BY SUM(views) DESC
    LIMIT 100
    
  3. Klicken Sie auf Ausführen.

bq

Geben Sie in Ihrem Terminal den folgenden bq query-Befehl ein, um eine interaktive Abfrage mit der Standard-SQL-Syntax auszuführen:

bq query \
--use_legacy_sql=false \
'SELECT
  TITLE, SUM(views)
FROM
  `bigquery-samples.wikipedia_pageviews.201207h`
GROUP BY
  TITLE
ORDER BY
  SUM(views) DESC
LIMIT 100'

Dadurch wird eine Abfrage ausgeführt, die die 100 Top-Wikipedia-Titel mit den meisten Aufrufen in einem bestimmten Monat zurückgibt und die Ausgabe in eine temporäre Tabelle schreibt.

Achten Sie darauf, wie lange die Ausführung der Abfrage dauert.

Workflow bereitstellen, der mehrere Abfragen nacheinander ausführt

Eine Workflowdefinition besteht aus einer Reihe von Schritten, die mithilfe der Workflow-Syntax beschrieben werden. Nachdem Sie einen Workflow erstellt haben, stellen Sie ihn für die Ausführung bereit. Im Bereitstellungsschritt wird auch geprüft, ob die Quelldatei ausgeführt werden kann.

Im folgenden Workflow wird eine Liste mit fünf Tabellen definiert, in denen mit dem BigQuery-Connector für Workflows eine Abfrage ausgeführt wird. Die Abfragen werden nacheinander ausgeführt und die am häufigsten angesehenen Titel aus jeder Tabelle werden in einer Ergebniszuordnung gespeichert.

Console

  1. Öffnen Sie in der Google Cloud Console die Seite Workflows.

    Zur Seite "Workflows"

  2. Klicken Sie auf Erstellen.

  3. Geben Sie einen Namen für den neuen Workflow ein, z. B. workflow-serial-bqjobs.

  4. Wählen Sie eine geeignete Region aus, z. B. us-central1.

  5. Wählen Sie das zuvor erstellte Dienstkonto aus.

    Sie sollten dem Dienstkonto bereits die IAM-Rollen BigQuery > BigQuery-Jobnutzer und Logging > Logautor zugewiesen haben.

  6. Klicken Sie auf Next (Weiter).

  7. Geben Sie im Workflow-Editor die folgende Definition für den Workflow ein:

    main:
        steps:
        - init:
            assign:
                - results : {} # result from each iteration keyed by table name
                - tables:
                    - 201201h
                    - 201202h
                    - 201203h
                    - 201204h
                    - 201205h
        - runQueries:
            for:
                value: table
                in: ${tables}
                steps:
                - logTable:
                    call: sys.log
                    args:
                        text: ${"Running query for table " + table}
                - runQuery:
                    call: googleapis.bigquery.v2.jobs.query
                    args:
                        projectId: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
                        body:
                            useLegacySql: false
                            useQueryCache: false
                            timeoutMs: 30000
                            # Find 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}
        - returnResults:
            return: ${results}
  8. Klicken Sie auf Bereitstellen.

gcloud

  1. Öffnen Sie ein Terminal und erstellen Sie eine Quellcodedatei für Ihren Workflow:

    touch workflow-serial-bqjobs.yaml
    
  2. Kopieren Sie den folgenden Workflow in Ihre Quellcodedatei:

    main:
        steps:
        - init:
            assign:
                - results : {} # result from each iteration keyed by table name
                - tables:
                    - 201201h
                    - 201202h
                    - 201203h
                    - 201204h
                    - 201205h
        - runQueries:
            for:
                value: table
                in: ${tables}
                steps:
                - logTable:
                    call: sys.log
                    args:
                        text: ${"Running query for table " + table}
                - runQuery:
                    call: googleapis.bigquery.v2.jobs.query
                    args:
                        projectId: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
                        body:
                            useLegacySql: false
                            useQueryCache: false
                            timeoutMs: 30000
                            # Find 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}
        - returnResults:
            return: ${results}
  3. Stellen Sie den Workflow bereit. Geben Sie hierzu den folgenden Befehl ein:

    gcloud workflows deploy workflow-serial-bqjobs \
       --source=workflow-serial-bqjobs.yaml \
       --service-account=MY_SERVICE_ACCOUNT@MY_PROJECT.IAM.GSERVICEACCOUNT.COM
    

    Ersetzen Sie MY_SERVICE_ACCOUNT@MY_PROJECT.IAM.GSERVICEACCOUNT.COM durch die E-Mail-Adresse des zuvor erstellten Dienstkontos.

    Sie sollten dem Dienstkonto bereits die IAM-Rollen roles/bigquery.jobUser und roles/logging.logWriter zugewiesen haben.

Workflow ausführen und mehrere Abfragen nacheinander ausführen

Bei der Ausführung eines Workflows wird die aktuelle Workflowdefinition ausgeführt, die dem Workflow zugeordnet ist.

Console

  1. Öffnen Sie in der Google Cloud Console die Seite Workflows.

    Zur Seite "Workflows"

  2. Wählen Sie auf der Seite Workflows den Workflow workflow-serial-bqjobs aus, um die zugehörige Detailseite aufzurufen.

  3. Klicken Sie auf der Seite Workflow-Details auf Ausführen.

  4. Klicken Sie noch einmal auf Ausführen.

  5. Sehen Sie sich die Ergebnisse des Workflows im Bereich Ausgabe an.

gcloud

  1. Öffnen Sie ein Terminalfenster.

  2. Führen Sie den Workflow aus:

     gcloud workflows run workflow-serial-bqjob

Die Workflowausführung dauert etwa eine Minute oder das Fünffache der vorherigen Ausführungszeit. Das Ergebnis enthält alle Tabellen und sieht in etwa so aus:

{
  "201201h": {
    "title": "Special:Search",
    "views": "14591339"
  },
  "201202h": {
    "title": "Special:Search",
    "views": "132765420"
  },
  "201203h": {
    "title": "Special:Search",
    "views": "123316818"
  },
  "201204h": {
    "title": "Special:Search",
    "views": "116830614"
  },
  "201205h": {
    "title": "Special:Search",
    "views": "131357063"
  }
}

Workflow bereitstellen und ausführen, der mehrere Abfragen parallel ausführt

Anstatt fünf Abfragen nacheinander auszuführen, können Sie die Abfragen parallel ausführen. Nehmen Sie dazu einige Änderungen vor:

 - runQueries:
    parallel:
        shared: [results]
        for:
            value: table
            in: ${tables}
  • Mit einem parallel-Schritt kann jede Iteration der for-Schleife parallel ausgeführt werden.
  • Die Variable results wird als shared deklariert, wodurch ein Zweig beschreibbar ist und das Ergebnis jedes Zweigs an sie angehängt werden kann.

Console

  1. Öffnen Sie in der Google Cloud Console die Seite Workflows.

    Zur Seite "Workflows"

  2. Klicken Sie auf Erstellen.

  3. Geben Sie einen Namen für den neuen Workflow ein, z. B. workflow-parallel-bqjobs.

  4. Wählen Sie eine geeignete Region aus, z. B. us-central1.

  5. Wählen Sie das zuvor erstellte Dienstkonto aus.

  6. Klicken Sie auf Next (Weiter).

  7. Geben Sie im Workflow-Editor die folgende Definition für den Workflow ein:

    main:
        steps:
        - init:
            assign:
                - results : {} # result from each iteration keyed by table name
                - tables:
                    - 201201h
                    - 201202h
                    - 201203h
                    - 201204h
                    - 201205h
        - runQueries:
            parallel:
                shared: [results]
                for:
                    value: table
                    in: ${tables}
                    steps:
                    - logTable:
                        call: sys.log
                        args:
                            text: ${"Running query for table " + table}
                    - runQuery:
                        call: googleapis.bigquery.v2.jobs.query
                        args:
                            projectId: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
                            body:
                                useLegacySql: false
                                useQueryCache: false
                                timeoutMs: 30000
                                # Find 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}
        - returnResults:
            return: ${results}
  8. Klicken Sie auf Bereitstellen.

  9. Klicken Sie auf der Seite Workflow-Details auf Ausführen.

  10. Klicken Sie noch einmal auf Ausführen.

  11. Sehen Sie sich die Ergebnisse des Workflows im Bereich Ausgabe an.

gcloud

  1. Öffnen Sie ein Terminal und erstellen Sie eine Quellcodedatei für Ihren Workflow:

    touch workflow-parallel-bqjobs.yaml
    
  2. Kopieren Sie den folgenden Workflow in Ihre Quellcodedatei:

    main:
        steps:
        - init:
            assign:
                - results : {} # result from each iteration keyed by table name
                - tables:
                    - 201201h
                    - 201202h
                    - 201203h
                    - 201204h
                    - 201205h
        - runQueries:
            parallel:
                shared: [results]
                for:
                    value: table
                    in: ${tables}
                    steps:
                    - logTable:
                        call: sys.log
                        args:
                            text: ${"Running query for table " + table}
                    - runQuery:
                        call: googleapis.bigquery.v2.jobs.query
                        args:
                            projectId: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
                            body:
                                useLegacySql: false
                                useQueryCache: false
                                timeoutMs: 30000
                                # Find 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}
        - returnResults:
            return: ${results}
  3. Stellen Sie den Workflow bereit. Geben Sie hierzu den folgenden Befehl ein:

    gcloud workflows deploy workflow-parallell-bqjobs \
       --source=workflow-parallel-bqjobs.yaml \
       --service-account=MY_SERVICE_ACCOUNT@MY_PROJECT.IAM.GSERVICEACCOUNT.COM
    

    Ersetzen Sie MY_SERVICE_ACCOUNT@MY_PROJECT.IAM.GSERVICEACCOUNT.COM durch die E-Mail-Adresse des zuvor erstellten Dienstkontos.

  4. Führen Sie den Workflow aus:

     gcloud workflows run workflow-serial-bqjob

Das Ergebnis ähnelt der vorherigen Ausgabe, die Workflowausführung sollte jedoch maximal 20 Sekunden dauern.

Bereinigen

Wenn Sie ein neues Projekt für diese Anleitung erstellt haben, löschen Sie das Projekt. Wenn Sie ein vorhandenes Projekt verwendet haben und es beibehalten möchten, ohne die Änderungen in dieser Anleitung hinzuzufügen, löschen Sie die für die Anleitung erstellten Ressourcen.

Projekt löschen

Am einfachsten vermeiden Sie weitere Kosten durch Löschen des für die Anleitung erstellten Projekts.

So löschen Sie das Projekt:

  1. Wechseln Sie in der Google Cloud Console zur Seite Ressourcen verwalten.

    Zur Seite „Ressourcen verwalten“

  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie dann auf Löschen.
  3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Shut down (Beenden), um das Projekt zu löschen.

Anleitungsressourcen löschen

Löschen Sie die in dieser Anleitung erstellten Workflows:

gcloud workflows delete WORKFLOW_NAME

Nächste Schritte