Creare una pipeline Dataflow con Python
In questa guida rapida imparerai a utilizzare l'SDK Apache Beam per Python per creare un programma che definisce una pipeline. Poi, esegui la pipeline utilizzando un runner locale diretto o un runner basato su cloud come Dataflow. Per un'introduzione alla pipeline WordCount, guarda il video Come utilizzare WordCount in Apache Beam.
Per seguire le indicazioni dettagliate per questa attività direttamente nella console Google Cloud, fai clic su Procedura guidata:
Prima di iniziare
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Dataflow, Compute Engine, Cloud Logging, Cloud Storage, Google Cloud Storage JSON, BigQuery, Cloud Pub/Sub, Cloud Datastore, and Cloud Resource Manager APIs:
gcloud services enable dataflow
compute_component logging storage_component storage_api bigquery pubsub datastore.googleapis.com cloudresourcemanager.googleapis.com -
Create local authentication credentials for your user account:
gcloud auth application-default login
-
Grant roles to your user account. Run the following command once for each of the following IAM roles:
roles/iam.serviceAccountUser
gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
- Replace
PROJECT_ID
with your project ID. -
Replace
USER_IDENTIFIER
with the identifier for your user account. For example,user:myemail@example.com
. - Replace
ROLE
with each individual role.
- Replace
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Dataflow, Compute Engine, Cloud Logging, Cloud Storage, Google Cloud Storage JSON, BigQuery, Cloud Pub/Sub, Cloud Datastore, and Cloud Resource Manager APIs:
gcloud services enable dataflow
compute_component logging storage_component storage_api bigquery pubsub datastore.googleapis.com cloudresourcemanager.googleapis.com -
Create local authentication credentials for your user account:
gcloud auth application-default login
-
Grant roles to your user account. Run the following command once for each of the following IAM roles:
roles/iam.serviceAccountUser
gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
- Replace
PROJECT_ID
with your project ID. -
Replace
USER_IDENTIFIER
with the identifier for your user account. For example,user:myemail@example.com
. - Replace
ROLE
with each individual role.
- Replace
Concedi i ruoli all'account di servizio predefinito di Compute Engine. Esegui il seguente comando una volta per ciascuno dei seguenti ruoli IAM:
roles/dataflow.admin
roles/dataflow.worker
roles/storage.objectAdmin
gcloud projects add-iam-policy-binding PROJECT_ID --member="serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com" --role=SERVICE_ACCOUNT_ROLE
- Sostituisci
PROJECT_ID
con l'ID progetto. - Sostituisci
PROJECT_NUMBER
con il numero del tuo progetto. Per trovare il numero del progetto, consulta Identificazione dei progetti oppure utilizza il comandogcloud projects describe
. - Sostituisci
SERVICE_ACCOUNT_ROLE
con ogni singolo ruolo.
-
Create a Cloud Storage bucket and configure it as follows:
-
Set the storage class to
S
(standard). -
Imposta la posizione di archiviazione come segue:
US
(Stati Uniti). -
Sostituisci
BUCKET_NAME
con un nome di bucket univoco. Non includere informazioni sensibili nella perché lo spazio dei nomi dei bucket è globale e visibile pubblicamente. - Copia l'ID progetto Google Cloud e il nome del bucket Cloud Storage. Ti serviranno questi valori più avanti in questo documento.
gcloud storage buckets create gs://BUCKET_NAME --default-storage-class STANDARD --location US
-
Set the storage class to
Configura l'ambiente
In questa sezione, utilizza il prompt dei comandi per configurare un ambiente virtuale Python isolato per eseguire il progetto della pipeline utilizzando venv. Questa procedura ti consente di isolare le dipendenze di un progetto da quelle di altri progetti.
Se non hai un prompt dei comandi a portata di mano, puoi utilizzare Cloud Shell. Cloud Shell ha già installato il gestore dei pacchetti per Python 3, quindi puoi passare alla creazione di un ambiente virtuale.
Per installare Python e creare un ambiente virtuale:
- Verifica che sul sistema siano in esecuzione Python 3 e
pip
:python --version python -m pip --version
- Se necessario, installa Python 3 e configura un ambiente virtuale Python: segui le istruzioni riportate nelle sezioni Installazione di Python e Configurazione di venv della pagina Configurazione di un ambiente di sviluppo Python. Se utilizzi Python 3.10 o versioni successive, devi anche abilitare Dataflow Runner v2. Per utilizzare Runner v1, utilizza Python 3.9 o versioni precedenti.
Dopo aver completato la procedura di avvio rapido, puoi disattivare l'ambiente virtuale eseguendo deactivate
.
Ottieni l'SDK Apache Beam
L'SDK Apache Beam è un modello di programmazione open source per pipeline di dati. Definisci una pipeline con un programma Apache Beam e poi scegli un runner, ad esempio Dataflow, per eseguirla.
Per scaricare e installare l'SDK Apache Beam:
- Verifica di trovarti nell'ambiente virtuale Python che hai creato nella sezione precedente.
Assicurati che il prompt inizi con
<env_name>
, doveenv_name
è il nome dell'ambiente virtuale. - Installa lo standard di pacchettizzazione Python wheel:
pip install wheel
- Installa la versione più recente dell'SDK Apache Beam per Python:
pip install 'apache-beam[gcp]'
Su Microsoft Windows, utilizza il seguente comando:
pip install apache-beam[gcp]
A seconda della connessione, l'installazione potrebbe richiedere del tempo.
Esegui la pipeline in locale
Per vedere come viene eseguita una pipeline localmente, utilizza un modulo Python pronto per l'esempio wordcount
incluso nel pacchetto apache_beam
.
L'esempio di pipeline wordcount
esegue le seguenti operazioni:
Accetta un file di testo come input.
Questo file di testo si trova in un bucket Cloud Storage con il nome della risorsa
gs://dataflow-samples/shakespeare/kinglear.txt
.- Analizza ogni riga in parole.
- Esegue un conteggio della frequenza delle parole tokenizzate.
Per eseguire lo staging della pipeline wordcount
localmente:
- Dal terminale locale, esegui l'esempio
wordcount
:python -m apache_beam.examples.wordcount \ --output outputs
- Visualizza l'output della pipeline:
more outputs*
- Per uscire, premi q.
wordcount.py
su GitHub di Apache Beam.
Esegui la pipeline nel servizio Dataflow
In questa sezione, esegui la pipeline di esempiowordcount
dal
apache_beam
pacchetto nel servizio Dataflow. Questo
esempio specifica DataflowRunner
come parametro per
--runner
.
- Esegui la pipeline:
python -m apache_beam.examples.wordcount \ --region DATAFLOW_REGION \ --input gs://dataflow-samples/shakespeare/kinglear.txt \ --output gs://BUCKET_NAME/results/outputs \ --runner DataflowRunner \ --project PROJECT_ID \ --temp_location gs://BUCKET_NAME/tmp/
Sostituisci quanto segue:
DATAFLOW_REGION
: la regione in cui vuoi eseguire il deployment del job Dataflow, ad esempioeurope-west1
Il flag
--region
sostituisce la regione predefinita impostata nel server dei metadati, nel client locale o nelle variabili di ambiente.BUCKET_NAME
: il nome del bucket Cloud Storage che hai copiato in precedenzaPROJECT_ID
: l'ID progetto Google Cloud che hai copiato in precedenza
Visualizza i tuoi risultati
Quando esegui una pipeline utilizzando Dataflow, i risultati vengono archiviati in un bucket Cloud Storage. In questa sezione, verifica che la pipeline sia in esecuzione utilizzando la console Google Cloud o il terminale locale.
Console Google Cloud
Per visualizzare i risultati nella console Google Cloud:
- Nella console Google Cloud, vai alla pagina Job di Dataflow.
La pagina Job mostra i dettagli del job
wordcount
, incluso lo stato iniziale In esecuzione e poi Riuscito. - Vai alla pagina Bucket di Cloud Storage.
Nell'elenco dei bucket del progetto, fai clic sul bucket di archiviazione creato in precedenza.
Nella directory
wordcount
vengono visualizzati i file di output creati dal job.
Terminale locale
Visualizza i risultati dal terminale o utilizzando Cloud Shell.
- Per elencare i file di output, utilizza il comando
gcloud storage ls
:gcloud storage ls gs://BUCKET_NAME/results/outputs* --long
- Per visualizzare i risultati nei file di output, utilizza il comando
gcloud storage cat
:gcloud storage cat gs://BUCKET_NAME/results/outputs*
Sostituisci BUCKET_NAME
con il nome del bucket Cloud Storage utilizzato
nel programma della pipeline.
Modificare il codice della pipeline
La pipelinewordcount
negli esempi precedenti distingue tra parole maiuscole e minuscole.
I passaggi riportati di seguito mostrano come modificare la pipeline in modo che la pipeline wordcount
non sia sensibile alle maiuscole.
- Sul computer locale, scarica la copia più recente del
codice
wordcount
dal repository GitHub di Apache Beam. - Dal terminale locale, esegui la pipeline:
python wordcount.py --output outputs
- Visualizza i risultati:
more outputs*
- Per uscire, premi q.
- Apri il file
wordcount.py
in un editor a tua scelta. - All'interno della funzione
run
, esamina i passaggi della pipeline:counts = ( lines | 'Split' >> (beam.ParDo(WordExtractingDoFn()).with_output_types(str)) | 'PairWithOne' >> beam.Map(lambda x: (x, 1)) | 'GroupAndSum' >> beam.CombinePerKey(sum))
Dopo
split
, le righe vengono suddivise in parole come stringhe. - Per mettere le stringhe in minuscolo, modifica la riga dopo
split
: Questa modifica mappa la funzionecounts = ( lines | 'Split' >> (beam.ParDo(WordExtractingDoFn()).with_output_types(str)) | 'lowercase' >> beam.Map(str.lower) | 'PairWithOne' >> beam.Map(lambda x: (x, 1)) | 'GroupAndSum' >> beam.CombinePerKey(sum))
str.lower
su ogni parola. Questa riga è equivalente abeam.Map(lambda word: str.lower(word))
. - Salva il file ed esegui il job
wordcount
modificato:python wordcount.py --output outputs
- Visualizza i risultati della pipeline modificata:
more outputs*
- Per uscire, premi q.
- Esegui la pipeline modificata nel servizio Dataflow:
python wordcount.py \ --region DATAFLOW_REGION \ --input gs://dataflow-samples/shakespeare/kinglear.txt \ --output gs://BUCKET_NAME/results/outputs \ --runner DataflowRunner \ --project PROJECT_ID \ --temp_location gs://BUCKET_NAME/tmp/
Sostituisci quanto segue:
DATAFLOW_REGION
: la regione in cui vuoi eseguire il deployment del job DataflowBUCKET_NAME
: il nome del bucket Cloud StoragePROJECT_ID
: il tuo ID progetto Google Cloud
Esegui la pulizia
Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate su questa pagina, elimina il progetto Google Cloud con le risorse.
- In the Google Cloud console, go to the Cloud Storage Buckets page.
- Click the checkbox for the bucket that you want to delete.
- To delete the bucket, click Delete, and then follow the instructions.
Se mantieni il progetto, revoca i ruoli che hai concesso all'account di servizio predefinito di Compute Engine. Esegui il seguente comando una volta per ciascuno dei seguenti ruoli IAM:
roles/dataflow.admin
roles/dataflow.worker
roles/storage.objectAdmin
gcloud projects remove-iam-policy-binding PROJECT_ID \ --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role=SERVICE_ACCOUNT_ROLE
-
Optional: Revoke the authentication credentials that you created, and delete the local credential file.
gcloud auth application-default revoke
-
Optional: Revoke credentials from the gcloud CLI.
gcloud auth revoke