Architettura
Il seguente diagramma mostra l'architettura di alto livello di una pipeline serverless di estrazione, caricamento e trasformazione (ELT) utilizzando Workflows.
Nel diagramma precedente, considera una piattaforma di vendita al dettaglio che raccoglie periodicamente gli eventi di vendita come file da vari negozi e quindi scrive i file in un bucket Cloud Storage. Gli eventi vengono usati per fornire metriche aziendali importando ed elaborando in BigQuery. Questa architettura fornisce un sistema di orchestrazione affidabile e serverless per importare i file in BigQuery ed è suddivisa nei seguenti due moduli:
- Elenco file: conserva l'elenco dei file non elaborati aggiunti a un bucket Cloud Storage in una raccolta Firestore.
Questo modulo utilizza una Cloud Function che viene attivata da un evento di archiviazione Finalizzazione dell'oggetto, generato quando viene aggiunto un nuovo file al bucket Cloud Storage. Il nome file viene aggiunto all'array
files
della raccolta denominatanew
in Firestore. Flusso di lavoro: esegue i flussi di lavoro pianificati. Cloud Scheduler attiva un flusso di lavoro che esegue una serie di passaggi in base a una sintassi basata su YAML per orchestrare il caricamento e poi trasformare i dati in BigQuery chiamando Cloud Functions. I passaggi del flusso di lavoro chiamano Cloud Functions per eseguire le attività seguenti:
- Crea e avvia un job di caricamento BigQuery.
- Esegui un sondaggio sullo stato del job di caricamento.
- Crea e avvia il job di trasformazione delle query.
- Esegui un sondaggio sullo stato del job di trasformazione.
L'utilizzo delle transazioni per gestire l'elenco dei nuovi file in Firestore garantisce che nessun file venga perso quando un flusso di lavoro li importa in BigQuery. Esecuzioni separate del flusso di lavoro sono rese idempotenti archiviando i metadati e lo stato del job in Firestore.
Obiettivi
- Creare un database Firestore.
- Configura un trigger di funzione Cloud Function per monitorare i file aggiunti al bucket Cloud Storage in Firestore.
- Esegui il deployment di Cloud Functions per eseguire e monitorare i job BigQuery.
- Eseguire il deployment e un flusso di lavoro per automatizzare il processo.
Costi
In questo documento, utilizzi i seguenti componenti fatturabili di Google Cloud:
Per generare una stima dei costi in base all'utilizzo previsto, utilizza il Calcolatore prezzi.
Una volta completate le attività descritte in questo documento, puoi evitare la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la pagina Pulizia.
Prima di iniziare
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.
-
Abilita le API Cloud Build, Cloud Functions, Identity and Access Management, Resource Manager, and Workflows.
Vai alla pagina Benvenuto e prendi nota dell'ID progetto da utilizzare in un passaggio successivo.
Nella console Google Cloud, attiva Cloud Shell.
prepara l'ambiente
Per preparare l'ambiente, crea un database Firestore, clona gli esempi di codice dal repository GitHub, crea risorse utilizzando Terraform, modifica il file YAML Workflows e installa i requisiti per il generatore di file.
Per creare un database Firestore, segui questi passaggi:
Nella console Google Cloud, vai alla pagina di Firestore.
Fai clic su Seleziona modalità nativa.
Nel menu Seleziona una località, scegli la regione in cui vuoi ospitare il database Firestore. Ti consigliamo di scegliere una regione vicina alla tua posizione fisica.
Fai clic su Crea database.
In Cloud Shell, clona il repository di codice sorgente:
cd $HOME && git clone https://github.com/GoogleCloudPlatform/workflows-demos cd workflows-demos/workflows-bigquery-load
In Cloud Shell, crea le risorse seguenti utilizzando Terraform:
terraform init terraform apply \ -var project_id=PROJECT_ID \ -var region=REGION \ -var zone=ZONE \ --auto-approve
Sostituisci quanto segue:
PROJECT_ID
: l'ID del tuo progetto Google CloudREGION
: una località geografica specifica di Google Cloud per ospitare le tue risorse, ad esempious-central1
ZONE
: una località all'interno di una regione per ospitare le tue risorse, ad esempious-central1-b
Dovresti vedere un messaggio simile al seguente:
Apply complete! Resources: 7 added, 0 changed, 1 destroyed.
Terraform può aiutarti a creare, modificare ed eseguire l'upgrade dell'infrastruttura su larga scala, in modo sicuro e prevedibile. Nel tuo progetto vengono create le seguenti risorse:
- Account di servizio con i privilegi necessari per garantire l'accesso sicuro alle risorse.
- Un set di dati BigQuery denominato
serverless_elt_dataset
e una tabella denominataword_count
per caricare i file in entrata. - Un bucket Cloud Storage denominato
${project_id}-ordersbucket
per i file di input temporanei. - Le seguenti cinque funzioni Cloud Functions:
file_add_handler
aggiunge il nome dei file che vengono aggiunti al bucket Cloud Storage alla raccolta Firestore.create_job
crea un nuovo job di caricamento BigQuery e associa i file nella raccolta Firebase al job.create_query
crea un nuovo job di query BigQuery.poll_bigquery_job
recupera lo stato di un job BigQuery.run_bigquery_job
avvia un job BigQuery.
Recupera gli URL per le funzioni Cloud Functions
create_job
,create_query
,poll_job
erun_bigquery_job
di cui hai eseguito il deployment nel passaggio precedente.gcloud functions describe create_job | grep url gcloud functions describe poll_bigquery_job | grep url gcloud functions describe run_bigquery_job | grep url gcloud functions describe create_query | grep url
L'output è simile al seguente:
url: https://REGION-PROJECT_ID.cloudfunctions.net/create_job url: https://REGION-PROJECT_ID.cloudfunctions.net/poll_bigquery_job url: https://REGION-PROJECT_ID.cloudfunctions.net/run_bigquery_job url: https://REGION-PROJECT_ID.cloudfunctions.net/create_query
Prendi nota di questi URL perché sono necessari quando esegui il deployment del flusso di lavoro.
Crea ed esegui il deployment di un flusso di lavoro
In Cloud Shell, apri il file di origine per il flusso di lavoro,
workflow.yaml
:Sostituisci quanto segue:
CREATE_JOB_URL
: l'URL della funzione per creare un nuovo jobPOLL_BIGQUERY_JOB_URL
: l'URL della funzione per eseguire il polling dello stato di un job in esecuzioneRUN_BIGQUERY_JOB_URL
: l'URL della funzione per avviare un job di caricamento BigQueryCREATE_QUERY_URL
: l'URL della funzione per avviare un job di query BigQueryBQ_REGION
: la regione BigQuery in cui sono archiviati i dati, ad esempioUS
BQ_DATASET_TABLE_NAME
: il nome della tabella del set di dati BigQuery nel formatoPROJECT_ID.serverless_elt_dataset.word_count
Esegui il deployment del file
workflow
:gcloud workflows deploy WORKFLOW_NAME \ --location=WORKFLOW_REGION \ --description='WORKFLOW_DESCRIPTION' \ --service-account=workflow-runner@PROJECT_ID.iam.gserviceaccount.com \ --source=workflow.yaml
Sostituisci quanto segue:
WORKFLOW_NAME
: il nome univoco del flusso di lavoroWORKFLOW_REGION
: la regione in cui viene eseguito il deployment del flusso di lavoro, ad esempious-central1
WORKFLOW_DESCRIPTION
: la descrizione del flusso di lavoro
Crea un ambiente virtuale Python 3 e installa i requisiti per il generatore di file:
sudo apt-get install -y python3-venv python3 -m venv env . env/bin/activate cd generator pip install -r requirements.txt
Genera file da importare
Lo script Python gen.py
genera contenuti casuali in formato Avro. Lo schema è uguale alla tabella word_count
di BigQuery. Questi file Avro vengono copiati
nel bucket Cloud Storage specificato.
In Cloud Shell, genera i file:
python gen.py -p PROJECT_ID \ -o PROJECT_ID-ordersbucket \ -n RECORDS_PER_FILE \ -f NUM_FILES \ -x FILE_PREFIX
Sostituisci quanto segue:
RECORDS_PER_FILE
: il numero di record in un singolo fileNUM_FILES
: il numero totale di file da caricareFILE_PREFIX
: il prefisso per i nomi dei file generati
Visualizza le voci del file in Firestore
Quando i file vengono copiati in Cloud Storage, viene attivata la Cloud Function handle_new_file
. Questa funzione aggiunge
l'elenco di file all'array di file nel documento new
nella
raccolta jobs
di Firestore.
Per visualizzare l'elenco dei file, vai alla pagina Dati di Firestore nella console Google Cloud.
Attiva il flusso di lavoro
Workflows collega una serie di attività serverless da Google Cloud e dai servizi API. I singoli passaggi di questo flusso di lavoro vengono eseguiti come Cloud Functions e lo stato è archiviato in Firestore. Tutte le chiamate a Cloud Functions vengono autenticate utilizzando l'account di servizio del flusso di lavoro.
In Cloud Shell, esegui il flusso di lavoro:
gcloud workflows execute WORKFLOW_NAME
Il seguente diagramma mostra i passaggi utilizzati nel flusso di lavoro:
Il flusso di lavoro è suddiviso in due parti: il flusso di lavoro principale e il flusso di lavoro secondario. Il flusso di lavoro principale gestisce la creazione del job e l'esecuzione condizionale, mentre il flusso di lavoro secondario esegue un job BigQuery. Il flusso di lavoro esegue le seguenti operazioni:
- La Cloud Function
create_job
crea un nuovo oggetto job, recupera l'elenco dei file aggiunti a Cloud Storage dal documento Firestore e associa i file al job di caricamento. Se non sono presenti file da caricare, la funzione non crea un nuovo job. - La Cloud Function
create_query
prende la query da eseguire insieme alla regione BigQuery in cui deve essere eseguita. La funzione crea il job in Firestore e restituisce l'ID job. - La Cloud Function
run_bigquery_job
ottiene l'ID del job da eseguire, quindi chiama l'API BigQuery per inviare il job. - Anziché attendere il completamento del job nella Cloud Function, puoi eseguire periodicamente il polling dello stato del job.
- La Cloud Function
poll_bigquery_job
fornisce lo stato del job. Viene chiamato ripetutamente fino al completamento del job. - Per aggiungere un ritardo tra le chiamate alla Cloud Function
poll_bigquery_job
, viene chiamata una routinesleep
da Workflows.
- La Cloud Function
Visualizzare lo stato del job
Puoi visualizzare l'elenco dei file e lo stato del job.
Nella console Google Cloud, vai alla pagina Dati di Firestore.
Per ogni job viene generato un identificatore univoco (UUID). Per visualizzare
job_type
estatus
, fai clic sull'ID job. Ogni job può avere uno dei seguenti tipi e stati:job_type
: il tipo di job eseguito dal flusso di lavoro con uno dei valori seguenti:- 0: carica i dati in BigQuery.
- 1. Esegui una query in BigQuery.
status
: lo stato attuale del job con uno dei seguenti valori:- 0: il job è stato creato, ma non è stato avviato.
- 1: il job è in esecuzione.
- 2: l'esecuzione del job è stata completata correttamente.
- 3: si è verificato un errore e il job non è stato completato correttamente.
L'oggetto job contiene anche attributi di metadati come la regione del set di dati BigQuery, il nome della tabella BigQuery e, se si tratta di un job di query, la stringa di query in esecuzione.
Visualizza i dati in BigQuery
Per confermare che il job ELT sia riuscito, verifica che i dati vengano visualizzati nella tabella.
Nella console Google Cloud, vai alla pagina Editor di BigQuery.
Fai clic sulla tabella
serverless_elt_dataset.word_count
.Fai clic sulla scheda Anteprima.
Pianifica il flusso di lavoro
Per eseguire periodicamente il flusso di lavoro in base a una pianificazione, puoi utilizzare Cloud Scheduler.
Esegui la pulizia
Il modo più semplice per eliminare la fatturazione è eliminare il progetto Google Cloud che hai creato per il tutorial. In alternativa, puoi eliminare le singole risorse.Elimina le singole risorse
In Cloud Shell, rimuovi tutte le risorse create con Terraform:
cd $HOME/bigquery-workflows-load terraform destroy \ -var project_id=PROJECT_ID \ -var region=REGION \ -var zone=ZONE \ --auto-approve
Nella console Google Cloud, vai alla pagina Dati di Firestore.
Accanto a Job, fai clic su
Menu e seleziona Elimina.
Elimina il progetto
- Nella console Google Cloud, vai alla pagina Gestisci risorse.
- Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
- Nella finestra di dialogo, digita l'ID del progetto e fai clic su Chiudi per eliminare il progetto.
Passaggi successivi
- Per saperne di più su BigQuery, consulta la documentazione di BigQuery.
- Scopri come creare pipeline di machine learning personalizzate serverless.
- Per altre architetture di riferimento, diagrammi e best practice, esplora il Cloud Architecture Center.