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 Terabytes von Daten mit integrierten Funktionen wie maschinellem Lernen, raumbezogenen Analysen 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 mehrere BigQuery-Abfragen nacheinander im Rahmen einer Workflows-Orchestrierung ausführen. Schließlich parallelisieren Sie die Abfragen mit der Funktion für parallele Iterationen von Workflows, um die Geschwindigkeit um das Fünffache zu steigern.

Lerninhalte

  • BigQuery-Abfragen für den Wikipedia-Datensatz ausführen
  • So führen Sie mehrere Abfragen als Teil einer Workflow-Orchestrierung seriell aus.
  • Abfragen mit paralleler Iteration in Workflows parallelisieren, um die Geschwindigkeit um das Fünffache zu steigern.

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. 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 Teilnehmer dieses Projekts. Es handelt sich um einen String, der nicht von Google APIs verwendet wird. Sie können ihn jederzeit aktualisieren.
  • Die Projekt-ID muss für alle Google Cloud-Projekte eindeutig sein und ist unveränderlich (kann nach der Festlegung nicht mehr geändert werden). In der Cloud Console wird automatisch ein eindeutiger String generiert. Normalerweise ist es nicht wichtig, wie dieser String aussieht. In den meisten Codelabs müssen Sie auf die Projekt-ID verweisen (sie wird in der Regel als PROJECT_ID angegeben). Wenn Ihnen die generierte ID nicht gefällt, können Sie eine andere zufällige ID generieren. Alternativ können Sie es mit einem eigenen versuchen und sehen, ob es verfügbar ist. Sie kann nach diesem Schritt nicht mehr geändert werden und bleibt für die Dauer des Projekts bestehen.
  • Zur Information: Es gibt einen dritten Wert, die Projektnummer, die von einigen APIs verwendet wird. Weitere Informationen zu diesen drei Werten
  1. Als Nächstes müssen Sie die Abrechnung in der Cloud Console aktivieren, um Cloud-Ressourcen/-APIs zu verwenden. Die Durchführung dieses Codelabs sollte keine oder nur geringe Kosten verursachen. Wenn Sie Ressourcen herunterfahren möchten, damit Ihnen nach Abschluss dieser Anleitung keine Kosten mehr in Rechnung gestellt werden, können Sie die von Ihnen erstellten Ressourcen oder das gesamte Projekt löschen. Neue Nutzer von Google Cloud kommen für das Programm für kostenlose Testversionen mit einem Guthaben von 300$ infrage.

Cloud Shell starten

Während Sie Google Cloud von Ihrem Laptop aus per Fernzugriff nutzen können, wird in diesem Codelab Google Cloud Shell verwendet, 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 sollte nur wenige Augenblicke dauern. Anschließend sehen Sie in etwa Folgendes:

7ffe5cbb04455448.png

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

3. Wikipedia-Dataset ansehen

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

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

ea75ab12a7c012a4.png

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

c9484e305b8e1438.png

Unter dem Dataset wikipedia_pageviews sehen 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 die Daten in der Vorschau an:

b5b2a334cd6f63c0.png

Sie können auch Abfragen für die Tabelle ausführen. Mit dieser Abfrage werden beispielsweise die 100 Titel mit den meisten Aufrufen ausgewählt:

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

Nachdem Sie die Abfrage ausgeführt haben, 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 ganz einfach. Es kann jedoch sehr mühsam sein, mehrere Abfragen für mehrere Tabellen auszuführen und die Ergebnisse zusammenzustellen. Dabei kann die Iterationssyntax von Workflows helfen.

Erstellen Sie in Cloud Shell eine workflow-serial.yaml-Datei, um einen Workflow zu erstellen, mit dem mehrere Abfragen für mehrere Tabellen ausgeführt werden:

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 nach Tabellennamen zu verfolgen. 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

Als Nächstes definieren Sie einen runQueries-Schritt. In diesem Schritt wird jede Tabelle durchlaufen und der BigQuery-Connector von Workflows verwendet, um eine Abfrage auszuführen, mit der die 100 Titel mit den meisten Seitenaufrufen in jeder Tabelle ermittelt werden. Anschließend werden der Top-Titel und die Aufrufe aus jeder Tabelle in der Ergebniskarte 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 results-Karte 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 die Workflows API aktivieren. Sie können sie über die Google Cloud Console oder mit gcloud in Cloud Shell aktivieren:

gcloud services enable workflows.googleapis.com

Dienstkonto für Workflows erstellen:

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

Prüfen Sie, ob das Dienstkonto die Rollen zum Protokollieren und Ausführen von BigQuery-Jobs hat:

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

Jetzt können Sie den Workflow ausführen.

Suchen Sie im Bereich „Workflows“ der Cloud Console 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 sollte etwa 1 Minute dauern (20 Sekunden für jede der 5 Tabellen).

Am Ende sehen Sie die Ausgabe der einzelnen Tabellen mit den Top-Titeln und ‑Aufrufen:

304d11a5bffdada4.png

baf31533d3671c9e.png

6. Mehrere Abfragen mit parallelen Schritten parallelisieren

Der Workflow im vorherigen Schritt hat etwa eine Minute gedauert, da fünf Abfragen ausgeführt wurden, die jeweils 20 Sekunden in Anspruch genommen haben. Da es sich um unabhängige Abfragen handelt, können Sie sie mit der Funktion für parallele Iterationen von Workflows parallel ausführen.

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

Ändern Sie in der Datei workflow-parallel.yaml den Schritt runQueries. Fügen Sie zuerst das Keyword parallel hinzu. So 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 Branch geschrieben werden. 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

Workflow ausführen:

gcloud workflows run bigquery-parallel

Die Workflow-Ausführung sollte etwa 20 Sekunden dauern. Das liegt daran, dass alle fünf Abfragen parallel ausgeführt werden. Bis zu 5-mal schneller mit nur wenigen Codezeilen

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

1825d49ef225c828.png

7. Glückwunsch

Herzlichen Glückwunsch! Sie haben das Codelab abgeschlossen. Weitere Informationen finden Sie in der Dokumentation zu Workflows zu parallelen Schritten.

Behandelte Themen

  • BigQuery-Abfragen für den Wikipedia-Datensatz ausführen
  • So führen Sie mehrere Abfragen als Teil einer Workflow-Orchestrierung seriell aus.
  • Abfragen mit paralleler Iteration in Workflows parallelisieren, um die Geschwindigkeit um bis zu 500 % zu steigern.