Trasmettere messaggi in streaming da Pub/Sub utilizzando Dataflow e Cloud Storage
Dataflow è un servizio completamente gestito per la trasformazione e l'arricchimento dei dati in modalità flusso (in tempo reale) e batch con uguale affidabilità ed espressività. Fornisce un ambiente di sviluppo delle pipeline semplificato utilizzando l'SDK Apache Beam, che dispone di un ricco set di primitive per windowing e analisi delle sessioni, nonché di un ecosistema di connettori di origine e sink. Questa guida rapida mostra come utilizzare Dataflow per:
- Leggi i messaggi pubblicati in un argomento Pub/Sub
- Raggruppa i messaggi per timestamp
- Scrivi i messaggi in Cloud Storage
Questa guida rapida introduce l'utilizzo di Dataflow in Java e Python. È supportato anche SQL. Questa guida rapida è disponibile anche come tutorial di Google Cloud Skills Boost, che offre credenziali temporanee per iniziare.
Se non intendi eseguire l'elaborazione personalizzata dei dati, puoi anche iniziare utilizzando i modelli Dataflow basati su UI.
Prima di iniziare
-
Install the Google Cloud CLI.
-
Configura gcloud CLI per utilizzare la tua identità federata.
Per ulteriori informazioni, vedi Accedere a gcloud CLI con la tua identità federata.
-
Per inizializzare gcloud CLI, esegui questo comando:
gcloud init
-
Create or select a Trusted Cloud project.
-
Create a Trusted Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Trusted Cloud project you are creating. -
Select the Trusted Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Trusted Cloud project name.
-
-
Verify that billing is enabled for your Trusted Cloud project.
-
Enable the Dataflow, Compute Engine, Cloud Logging, Cloud Storage, Trusted Cloud by S3NS Storage JSON API, Pub/Sub, Resource Manager, and Cloud Scheduler APIs:
gcloud services enable dataflow.googleapis.com
compute.googleapis.com logging.googleapis.com storage-component.googleapis.com storage-api.googleapis.com pubsub.googleapis.com cloudresourcemanager.googleapis.com cloudscheduler.googleapis.com -
Set up authentication:
-
Create the service account:
gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
Replace
SERVICE_ACCOUNT_NAME
with a name for the service account. -
Grant roles to the service account. Run the following command once for each of the following IAM roles:
roles/dataflow.worker, roles/storage.objectAdmin, roles/pubsub.admin
:gcloud projects add-iam-policy-binding PROJECT_ID --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.s3ns-system.iam.gserviceaccount.com" --role=ROLE
Replace the following:
SERVICE_ACCOUNT_NAME
: the name of the service accountPROJECT_ID
: the project ID where you created the service accountROLE
: the role to grant
-
Grant the required role to the principal that will attach the service account to other resources.
gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT_NAME@PROJECT_ID.s3ns-system.iam.gserviceaccount.com --member="principal://iam.googleapis.com/locations/global/workforcePools/POOL_ID/subject/SUBJECT_ID" --role=roles/iam.serviceAccountUser
Replace the following:
SERVICE_ACCOUNT_NAME
: the name of the service account.PROJECT_ID
: the project ID where you created the service account.POOL_ID
: a workforce identity pool ID.-
SUBJECT_ID
: a subject ID; typically the identifier for a user in a workforce identity pool. For details, see Represent workforce pool users in IAM policies.
-
-
Create local authentication credentials for your user account:
gcloud auth application-default login
If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.
Configurare il progetto Pub/Sub
-
Crea variabili per il bucket, il progetto e la regione. I nomi dei bucket Cloud Storage devono essere univoci a livello globale. Seleziona una regione Dataflow vicina a quella in cui esegui i comandi in questa guida rapida. Il valore della variabile
REGION
deve essere un nome di regione valido. Per saperne di più su regioni e località, consulta Località di Dataflow.BUCKET_NAME=BUCKET_NAME PROJECT_ID=$(gcloud config get-value project) TOPIC_ID=TOPIC_ID REGION=DATAFLOW_REGION SERVICE_ACCOUNT=SERVICE_ACCOUNT_NAME@PROJECT_ID.s3ns-system.iam.gserviceaccount.com
-
Crea un bucket Cloud Storage di proprietà di questo progetto:
gcloud storage buckets create gs://$BUCKET_NAME
-
Crea un argomento Pub/Sub in questo progetto:
gcloud pubsub topics create $TOPIC_ID
-
Crea un job Cloud Scheduler in questo progetto. Il job pubblica un messaggio in un argomento Pub/Sub a intervalli di un minuto.
Se non esiste un'app App Engine per il progetto, questo passaggio ne creerà una.
gcloud scheduler jobs create pubsub publisher-job --schedule="* * * * *" \ --topic=$TOPIC_ID --message-body="Hello!" --location=$REGION
Avvia il lavoro.
gcloud scheduler jobs run publisher-job --location=$REGION
-
Utilizza i seguenti comandi per clonare il repository di avvio rapido e passare alla directory del codice campione:
Java
git clone https://github.com/GoogleCloudPlatform/java-docs-samples.git cd java-docs-samples/pubsub/streaming-analytics
Python
git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git cd python-docs-samples/pubsub/streaming-analytics pip install -r requirements.txt # Install Apache Beam dependencies
Trasmettere flussi di messaggi da Pub/Sub a Cloud Storage
Esempio di codice
Questo codice campione utilizza Dataflow per:
- Leggi i messaggi Pub/Sub.
- Raggruppa i messaggi in intervalli di dimensioni fisse in base ai timestamp di pubblicazione.
Scrivi i messaggi in ogni finestra nei file in Cloud Storage.
Java
Python
Avvia la pipeline
Per avviare la pipeline, esegui questo comando:
Java
mvn compile exec:java \ -Dexec.mainClass=com.examples.pubsub.streaming.PubSubToGcs \ -Dexec.cleanupDaemonThreads=false \ -Dexec.args=" \ --project=$PROJECT_ID \ --region=$REGION \ --inputTopic=projects/$PROJECT_ID/topics/$TOPIC_ID \ --output=gs://$BUCKET_NAME/samples/output \ --gcpTempLocation=gs://$BUCKET_NAME/temp \ --runner=DataflowRunner \ --windowSize=2 \ --serviceAccount=$SERVICE_ACCOUNT"
Python
python PubSubToGCS.py \ --project=$PROJECT_ID \ --region=$REGION \ --input_topic=projects/$PROJECT_ID/topics/$TOPIC_ID \ --output_path=gs://$BUCKET_NAME/samples/output \ --runner=DataflowRunner \ --window_size=2 \ --num_shards=2 \ --temp_location=gs://$BUCKET_NAME/temp \ --service_account_email=$SERVICE_ACCOUNT
Il comando precedente viene eseguito localmente e avvia un job Dataflow
che viene eseguito nel cloud. Quando il comando restituisce JOB_MESSAGE_DETAILED: Workers
have started successfully
, esci dal programma locale utilizzando Ctrl+C
.
Osserva l'avanzamento di job e pipeline
Puoi osservare l'avanzamento del job nella console Dataflow.
Apri la visualizzazione dei dettagli del job per visualizzare:
- Struttura del job
- Log job
- Metriche della fase
Potresti dover attendere alcuni minuti prima di visualizzare i file di output in Cloud Storage.
In alternativa, utilizza la riga di comando riportata di seguito per verificare quali file sono stati scritti.
gcloud storage ls gs://${BUCKET_NAME}/samples/
L'output dovrebbe essere simile al seguente:
Java
gs://{$BUCKET_NAME}/samples/output-22:30-22:32-0-of-1 gs://{$BUCKET_NAME}/samples/output-22:32-22:34-0-of-1 gs://{$BUCKET_NAME}/samples/output-22:34-22:36-0-of-1 gs://{$BUCKET_NAME}/samples/output-22:36-22:38-0-of-1
Python
gs://{$BUCKET_NAME}/samples/output-22:30-22:32-0 gs://{$BUCKET_NAME}/samples/output-22:30-22:32-1 gs://{$BUCKET_NAME}/samples/output-22:32-22:34-0 gs://{$BUCKET_NAME}/samples/output-22:32-22:34-1
Esegui la pulizia
Per evitare che al tuo account Trusted Cloud vengano addebitati costi relativi alle risorse utilizzate in questa pagina, elimina il progetto Trusted Cloud con le risorse.
Elimina il job Cloud Scheduler.
gcloud scheduler jobs delete publisher-job --location=$REGION
Nella console Dataflow, arresta il job. Annulla la pipeline senza svuotarla.
Elimina l'argomento.
gcloud pubsub topics delete $TOPIC_ID
Elimina i file creati dalla pipeline.
gcloud storage rm "gs://${BUCKET_NAME}/samples/output*" --recursive --continue-on-error gcloud storage rm "gs://${BUCKET_NAME}/temp/*" --recursive --continue-on-error
Rimuovi il bucket Cloud Storage.
gcloud storage rm gs://${BUCKET_NAME} --recursive
-
Elimina il account di servizio:
gcloud iam service-accounts delete SERVICE_ACCOUNT_EMAIL
-
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
Passaggi successivi
Se vuoi visualizzare i messaggi Pub/Sub in base a un timestamp personalizzato, puoi specificare il timestamp come attributo nel messaggio Pub/Sub e poi utilizzare il timestamp personalizzato con
withTimestampAttribute
di PubsubIO.Dai un'occhiata ai modelli Dataflow open source progettati per lo streaming.
Scopri di più su come Dataflow si integra con Pub/Sub.
Consulta questo tutorial che legge da Pub/Sub e scrive in BigQuery utilizzando i modelli Dataflow Flex.
Per saperne di più sul windowing, consulta l'esempio di pipeline di giochi per dispositivi mobili Apache Beam.