BigQuery-Jobs parallel zu Workflows ausführen

1. Einführung

1c05e3d0c2bd2b45.png 74be7b376d45258a.png

Workflows ist ein vollständig verwalteter Orchestrierungsdienst, der Google Cloud oder externe Dienste in der von Ihnen definierten Reihenfolge ausführt.

BigQuery ist ein vollständig verwaltetes Data Warehouse für Unternehmen, mit dem Sie Terabyte an Daten mit integrierten Funktionen wie maschinellem Lernen, raumbezogener Analyse und Business Intelligence verwalten und analysieren können.

In diesem Codelab führen Sie einige BigQuery-Abfragen für das öffentliche Wikipedia-Dataset aus. Anschließend erfahren Sie, wie Sie im Rahmen einer Workflow-Orchestrierung nacheinander mehrere BigQuery-Abfragen nacheinander ausführen. Schließlich parallelisieren Sie die Abfragen mit der parallelen Iterationsfunktion von Workflows, um die Geschwindigkeit um bis zu fünfmal zu verbessern.

Lerninhalte

  • So führen Sie BigQuery-Abfragen für das Wikipedia-Dataset aus.
  • So führen Sie mehrere Abfragen als Teil einer Workflow-Orchestrierung nacheinander aus.
  • Hier erfahren Sie, wie Sie Abfragen mit der parallelen Iteration von Workflows parallelisieren, um die Geschwindigkeit um bis zu 5-mal zu verbessern.

2. Einrichtung und Anforderungen

Umgebung zum selbstbestimmten Lernen einrichten

  1. Melden Sie sich in der Google Cloud Console an und erstellen Sie ein neues Projekt oder verwenden Sie ein vorhandenes Projekt. Wenn Sie noch kein Gmail- oder Google Workspace-Konto haben, müssen Sie eines erstellen.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Der Projektname ist der Anzeigename für die Projektteilnehmer. Es handelt sich um eine Zeichenfolge, die von Google APIs nicht verwendet wird. Sie können sie jederzeit aktualisieren.
  • Die Projekt-ID muss für alle Google Cloud-Projekte eindeutig sein und ist unveränderlich. Sie kann nach dem Festlegen nicht mehr geändert werden. Die Cloud Console generiert automatisch einen eindeutigen String. ist Ihnen meist egal, was es ist. In den meisten Codelabs musst du auf die Projekt-ID verweisen, die üblicherweise als PROJECT_ID gekennzeichnet ist. Wenn Ihnen die generierte ID nicht gefällt, können Sie eine weitere zufällige ID erstellen. Alternativ können Sie einen eigenen verwenden und nachsehen, ob er verfügbar ist. Sie kann nach diesem Schritt nicht mehr geändert werden und bleibt für die Dauer des Projekts bestehen.
  • Zur Information gibt es noch einen dritten Wert, die Projektnummer, die von manchen APIs verwendet wird. Weitere Informationen zu allen drei Werten finden Sie in der Dokumentation.
  1. Als Nächstes müssen Sie in der Cloud Console die Abrechnung aktivieren, um Cloud-Ressourcen/APIs verwenden zu können. Dieses Codelab sollte möglichst wenig kosten. Wenn Sie Ressourcen herunterfahren möchten, um über diese Anleitung hinaus keine Kosten zu verursachen, können Sie die von Ihnen erstellten Ressourcen oder das gesamte Projekt löschen. Neue Google Cloud-Nutzer haben Anspruch auf eine kostenlose Testversion mit 300$Guthaben.

Cloud Shell starten

Sie können Google Cloud zwar von Ihrem Laptop aus der Ferne bedienen, in diesem Codelab verwenden Sie jedoch Google Cloud Shell, eine Befehlszeilenumgebung, die in der Cloud ausgeführt wird.

Klicken Sie in der Google Cloud Console rechts oben in der Symbolleiste auf das Cloud Shell-Symbol:

55efc1aaa7a4d3ad.png

Die Bereitstellung und Verbindung mit der Umgebung dauert nur einen Moment. Wenn er abgeschlossen ist, sollten Sie in etwa Folgendes sehen:

7ffe5cbb04455448.png

Diese virtuelle Maschine verfügt über sämtliche Entwicklertools, die Sie benötigen. Es bietet ein Basisverzeichnis mit 5 GB nichtflüchtigem Speicher und läuft auf Google Cloud, wodurch die Netzwerkleistung und Authentifizierung erheblich verbessert werden. Alle Arbeiten in diesem Codelab können in einem Browser erledigt werden. Sie müssen nichts installieren.

3. Das Wikipedia-Dataset untersuchen

Sehen Sie sich zuerst das Wikipedia-Dataset in BigQuery an.

Rufen Sie in der Google Cloud Console den Bereich „BigQuery“ auf:

ea75ab12a7c012a4.png

Unter bigquery-samples sollten verschiedene öffentliche Datasets angezeigt werden, darunter einige zu Wikipedia gehörende Datasets:

c9484e305b8e1438.png

Im Dataset wikipedia_pageviews finden Sie verschiedene Tabellen für Seitenaufrufe aus verschiedenen Jahren:

c540a4162640cbb3.png

Sie können eine der Tabellen auswählen (z. B. 201207) und sehen Sie sich eine Vorschau der Daten an:

b5b2a334cd6f63c0.png

Sie können auch Abfragen für die Tabelle ausführen. Die folgende Abfrage wählt beispielsweise die 100 Titel mit den meisten Aufrufen aus:

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

Nach dem Ausführen der Abfrage dauert es etwa 20 Sekunden, bis die Daten geladen sind:

1df3877aed1653b4.png

4. Workflow zum Ausführen mehrerer Abfragen definieren

Das Ausführen einer Abfrage für eine einzelne Tabelle ist einfach. Mehrere Abfragen für mehrere Tabellen auszuführen und die Ergebnisse zu sortieren, kann jedoch sehr mühsam sein. Zu diesem Zweck kann Workflows mit seiner Iterationssyntax helfen.

Erstellen Sie in Cloud Shell eine workflow-serial.yaml-Datei, um einen Workflow zum Ausführen mehrerer Abfragen für mehrere Tabellen zu erstellen:

touch workflow-serial.yaml

Anschließend können Sie die Datei mit dem Editor in Cloud Shell bearbeiten:

33bf9325b078ad8.png

Erstellen Sie in der Datei workflow-serial.yaml im ersten Schritt init eine results-Zuordnung, um jede Iteration mit Tabellennamen nachzuverfolgen. Definieren Sie außerdem ein tables-Array mit der Liste der Tabellen, für die Sie Abfragen ausführen möchten. In diesem Fall wählen wir 5 Tabellen aus:

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

Definieren Sie als Nächstes einen runQueries-Schritt. Dieser Schritt durchläuft alle Tabellen und verwendet BigQuery-Connector zum Ausführen einer Abfrage, um die 100 Titel mit den meisten Seitenaufrufen in jeder Tabelle zu ermitteln. Anschließend werden der Top-Titel und die besten Ansichten aus jeder Tabelle in der Ergebniszuordnung gespeichert:

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

Geben Sie im letzten Schritt die Karte results zurück:

    - returnResults:
        return: ${results}

5. Mehrere Abfragen mit Workflows ausführen

Bevor Sie den Workflow bereitstellen und ausführen können, müssen Sie prüfen, ob die Workflows API aktiviert ist. Sie können sie über die Google Cloud Console oder mithilfe von gcloud in Cloud Shell aktivieren:

gcloud services enable workflows.googleapis.com

Erstellen Sie ein Dienstkonto für Workflows:

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

Das Dienstkonto muss die Rollen zum Protokollieren und Ausführen von BigQuery-Jobs haben:

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

Stellen Sie den Workflow mit dem Dienstkonto bereit:

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

Schließlich können Sie den Workflow ausführen.

Suchen Sie in der Cloud Console im Abschnitt „Workflows“ nach dem Workflow bigquery-serial und klicken Sie auf die Schaltfläche Execute:

b6afa4747680334f.png

Alternativ können Sie den Workflow auch mit gcloud in Cloud Shell ausführen:

gcloud workflows run bigquery-serial

Die Workflowausführung dauert etwa eine Minute (20 Sekunden für jede der fünf Tabellen).

Am Ende sehen Sie die Ausgabe jeder Tabelle mit Top-Titeln und -Ansichten:

304d11a5bffdada4.png

baf31533d3671c9e.png

6. Mehrere Abfragen mit parallelen Schritten parallelisieren

Der Workflow im vorherigen Schritt dauerte etwa eine Minute, weil 5 Abfragen mit jeweils 20 Sekunden ausgeführt wurden. Da es sich hierbei um unabhängige Abfragen handelt, können Sie sie mit der Funktion für parallele Iterationen von Workflows parallel ausführen.

Kopieren Sie die Datei workflow-serial.yaml in eine neue workflow-parallel.yaml-Datei. In der neuen Datei nehmen Sie einige Änderungen vor, um die seriellen Schritte in parallele Schritte umzuwandeln.

Ändern Sie in der Datei workflow-parallel.yaml den Schritt runQueries. Fügen Sie zuerst das Keyword parallel hinzu. Dadurch kann jede Iteration der For-Schleife parallel ausgeführt werden. Zweitens: Deklarieren Sie die Variable results als shared-Variable. Dadurch kann die Variable von einem Zweig beschreibbar sein. Wir hängen jedes Ergebnis an diese Variable an.

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

Stellen Sie den parallelen Workflow bereit:

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

Führen Sie den Workflow aus:

gcloud workflows run bigquery-parallel

Die Workflowausführung dauert etwa 20 Sekunden. Dies ist darauf zurückzuführen, dass alle fünf Abfragen parallel ausgeführt werden. Bis zu 5-fache Geschwindigkeit mit nur wenigen Codeänderungen

Am Ende sehen Sie die gleiche Ausgabe aus jeder Tabelle mit Top-Titeln und -Aufrufen, aber mit viel kürzerer Ausführungszeit:

1825d49ef225c828.png

7. Glückwunsch

Glückwunsch, du hast das Codelab abgeschlossen. Weitere Informationen finden Sie in der Dokumentation zu parallelen Schritten.

Behandelte Themen

  • So führen Sie BigQuery-Abfragen für das Wikipedia-Dataset aus.
  • So führen Sie mehrere Abfragen als Teil einer Workflow-Orchestrierung nacheinander aus.
  • Abfragen mit paralleler Iteration von Workflows parallelisieren, um die Geschwindigkeit um bis zu 5-mal zu verbessern.