Esecuzione di job BigQuery in parallelo a Workflows

1. Introduzione

1c05e3d0c2bd2b45.png 74be7b376d45258a.png

Workflows è un servizio di orchestrazione completamente gestito che esegue Google Cloud o servizi esterni nell'ordine da te definito.

BigQuery è un data warehouse aziendale completamente gestito che ti aiuta a gestire e analizzare terabyte di dati con funzionalità integrate come machine learning, analisi geospaziale e business intelligence.

In questo codelab, eseguirai alcune query BigQuery sul set di dati pubblico di Wikipedia. Vedrai quindi come eseguire più query BigQuery una dopo l'altra in modo seriale, come parte di un'orchestrazione di Workflows. Infine, metterai in contemporanea le query utilizzando la funzionalità di iterazione parallela di Workflows per migliorare la velocità fino a 5 volte.

Obiettivi didattici

  • Come eseguire query in BigQuery sul set di dati di Wikipedia.
  • Come eseguire più query come parte di un'orchestrazione di Workflows in serie.
  • Come caricare in contemporanea le query utilizzando l'iterazione parallela di Workflows per migliorare la velocità fino a 5 volte.

2. Configurazione e requisiti

Configurazione dell'ambiente autogestito

  1. Accedi alla console Google Cloud e crea un nuovo progetto o riutilizzane uno esistente. Se non hai ancora un account Gmail o Google Workspace, devi crearne uno.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Il Nome progetto è il nome visualizzato dei partecipanti del progetto. Si tratta di una stringa di caratteri non utilizzata dalle API di Google. Puoi aggiornarla in qualsiasi momento.
  • L'ID progetto deve essere univoco in tutti i progetti Google Cloud ed è immutabile (non può essere modificato dopo essere stato impostato). La console Cloud genera automaticamente una stringa univoca. di solito non ti importa cosa sia. Nella maggior parte dei codelab, dovrai fare riferimento all'ID progetto (in genere è identificato come PROJECT_ID). Se l'ID generato non ti soddisfa, puoi generarne un altro casuale. In alternativa, puoi provarne una personalizzata per verificare se è disponibile. Non può essere modificato dopo questo passaggio e rimarrà per tutta la durata del progetto.
  • Per informazione, c'è un terzo valore, un numero di progetto, utilizzato da alcune API. Scopri di più su tutti e tre questi valori nella documentazione.
  1. Successivamente, dovrai abilitare la fatturazione nella console Cloud per utilizzare risorse/API Cloud. Eseguire questo codelab non dovrebbe costare molto. Per arrestare le risorse in modo da non incorrere in fatturazione oltre questo tutorial, puoi eliminare le risorse che hai creato o eliminare l'intero progetto. I nuovi utenti di Google Cloud sono idonei al programma prova senza costi di 300$.

Avvia Cloud Shell

Anche se Google Cloud può essere utilizzato da remoto dal tuo laptop, in questo codelab utilizzerai Google Cloud Shell, un ambiente a riga di comando in esecuzione nel cloud.

Dalla console Google Cloud, fai clic sull'icona di Cloud Shell nella barra degli strumenti in alto a destra:

55efc1aaa7a4d3ad.png

Dovrebbe richiedere solo qualche istante per eseguire il provisioning e connettersi all'ambiente. Al termine, dovresti vedere una schermata simile al seguente:

7ffe5cbb04455448.png

Questa macchina virtuale viene caricata con tutti gli strumenti di sviluppo necessari. Offre una home directory permanente da 5 GB e viene eseguita su Google Cloud, migliorando notevolmente le prestazioni di rete e l'autenticazione. Tutto il lavoro in questo codelab può essere svolto all'interno di un browser. Non occorre installare nulla.

3. Esplorare il set di dati Wikipedia

Innanzitutto, esplora il set di dati di Wikipedia in BigQuery.

Vai alla sezione BigQuery della console Google Cloud:

ea75ab12a7c012a4.png

Sotto bigquery-samples, dovresti vedere vari set di dati pubblici, tra cui alcuni relativi a Wikipedia:

c9484e305b8e1438.png

Sotto il set di dati wikipedia_pageviews, puoi vedere varie tabelle per le visualizzazioni di pagina di anni diversi:

c540a4162640cbb3.png

Puoi selezionare una delle tabelle (ad es. 201207) e visualizza l'anteprima dei dati:

b5b2a334cd6f63c0.png

Puoi anche eseguire query sulla tabella. Ad esempio, questa query seleziona i primi 100 titoli con il maggior numero di visualizzazioni:

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

Una volta eseguita la query, il caricamento dei dati richiede circa 20 secondi:

1df3877aed1653b4.png

4. Definisci un flusso di lavoro per l'esecuzione di più query

Eseguire una query su una singola tabella è facile. Tuttavia, l'esecuzione di più query su più tabelle e il confronto dei risultati può essere piuttosto noioso. Per semplificare l'operazione, Workflows può aiutarti con la sintassi di iterazione.

All'interno di Cloud Shell, crea un file workflow-serial.yaml per creare un flusso di lavoro per eseguire più query su più tabelle:

touch workflow-serial.yaml

Quindi, puoi modificare il file con l'editor in Cloud Shell:

33bf9325b078ad8.png

All'interno del file workflow-serial.yaml, nel primo passaggio init, crea una mappa results per tenere traccia di ogni iterazione in base ai nomi delle tabelle. Definisci inoltre un array tables con l'elenco delle tabelle su cui eseguire le query. In questo caso, abbiamo scelto 5 tabelle:

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

A questo punto, definisci un passaggio runQueries. Questo passaggio esegue l'iterazione su ogni tabella e utilizza Workflows Connettore BigQuery per eseguire una query per trovare i primi 100 titoli con il maggior numero di visualizzazioni di pagina in ogni tabella. Salva quindi il titolo e le visualizzazioni principali di ogni tabella nella mappa dei risultati:

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

Nel passaggio finale, restituisci la mappa results:

    - returnResults:
        return: ${results}

5. Eseguire più query con Workflows

Prima di poter eseguire il deployment e il flusso di lavoro, devi assicurarti che l'API Workflows sia abilitata. Puoi abilitarlo dalla console Google Cloud o utilizzando gcloud in Cloud Shell:

gcloud services enable workflows.googleapis.com

Crea un account di servizio per Workflows:

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

Assicurati che l'account di servizio disponga dei ruoli per registrare ed eseguire i job 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

Esegui il deployment del flusso di lavoro con l'account di servizio:

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

Infine, puoi eseguire il flusso di lavoro.

Individua il flusso di lavoro bigquery-serial nella sezione Flussi di lavoro di Cloud Console e premi il pulsante Execute:

b6afa4747680334f.png

In alternativa, puoi anche eseguire il flusso di lavoro con gcloud in Cloud Shell:

gcloud workflows run bigquery-serial

L'esecuzione del flusso di lavoro dovrebbe durare circa 1 minuto (20 secondi per ciascuna delle 5 tabelle).

Alla fine, vedrai l'output di ogni tabella con i titoli e le visualizzazioni principali:

304d11a5bffdada4.png

baf31533d3671c9e.png

6. Caricare in contemporanea più query con passaggi paralleli

Il flusso di lavoro nel passaggio precedente ha richiesto circa un minuto perché ha eseguito 5 query della durata di 20 secondi ciascuna. Poiché si tratta di query indipendenti, puoi eseguirle in parallelo utilizzando la funzionalità di iterazione parallela di Workflows.

Copia il file workflow-serial.yaml in un nuovo file workflow-parallel.yaml. Nel nuovo file apporterai un paio di modifiche per trasformare i passaggi seriali in passaggi paralleli.

Nel file workflow-parallel.yaml, modifica il passaggio runQueries. Innanzitutto, aggiungi la parola chiave parallel. In questo modo ogni iterazione del ciclo for può essere eseguita in parallelo. Quindi, dichiara la variabile results come variabile shared. Ciò consente alla variabile di essere scrivibile da un ramo. Ogni risultato verrà aggiunto a questa variabile.

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

Esegui il deployment del flusso di lavoro parallelo:

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

Esegui il flusso di lavoro:

gcloud workflows run bigquery-parallel

L'esecuzione del flusso di lavoro dovrebbe durare circa 20 secondi. Ciò è dovuto al fatto che tutte e 5 le query vengono eseguite in parallelo. Miglioramento della velocità fino a 5 volte superiore con solo un paio di righe di modifica del codice.

Alla fine, otterrai lo stesso output per ogni tabella con i titoli e le visualizzazioni principali, ma con tempi di esecuzione molto più brevi:

1825d49ef225c828.png

7. Complimenti

Complimenti, hai completato il codelab. Per saperne di più, consulta la documentazione di Workflows sui passaggi paralleli.

Argomenti trattati

  • Come eseguire query in BigQuery sul set di dati di Wikipedia.
  • Come eseguire più query come parte di un'orchestrazione di Workflows in serie.
  • Come caricare in contemporanea le query utilizzando l'iterazione parallela di Workflows per migliorare la velocità fino a 5 volte.