Questo documento descrive come eseguire una pipeline Dataflow utilizzando un container personalizzato.
Per informazioni sulla creazione dell'immagine container, consulta Creare immagini container personalizzate per Dataflow.
Quando esegui la pipeline, avviala utilizzando l'SDK Apache Beam con la stessa versione e la stessa versione della lingua dell'SDK sull'immagine container personalizzata. Questo passaggio evita errori imprevisti dovuti a dipendenze o SDK incompatibili.
Testare localmente
Prima di eseguire la pipeline in Dataflow, ti consigliamo di testare l'immagine container localmente, in modo da poter eseguire test e debug più rapidamente.
Per scoprire di più sull'utilizzo specifico di Apache Beam, consulta la guida di Apache Beam per l'esecuzione di pipeline con immagini container personalizzate.
Test di base con PortableRunner
Per verificare che le immagini container remote possano essere estratte ed eseguire una pipeline semplice, utilizza PortableRunner di Apache Beam. Quando utilizzi PortableRunner, l'invio del job avviene nell'ambiente locale e l'esecuzione di DoFn avviene nell'ambiente Docker.
Quando utilizzi le GPU, il container Docker potrebbe non avere accesso alle GPU. Per testare il container con le GPU, utilizza il runner diretto e segui i passaggi per testare un'immagine container su una VM autonoma con GPU nella sezione Eseguire il debug con una VM autonoma della pagina "Utilizzare le GPU".
Di seguito viene eseguita una pipeline di esempio:
Java
mvn compile exec:java -Dexec.mainClass=com.example.package.MyClassWithMain \
-Dexec.args="--runner=PortableRunner \
--jobEndpoint=REGION \
--defaultEnvironmentType=DOCKER \
--defaultEnvironmentConfig=IMAGE_URI \
--inputFile=INPUT_FILE \
--output=OUTPUT_FILE"Python
python path/to/my/pipeline.py \
--runner=PortableRunner \
--job_endpoint=REGION \
--environment_type=DOCKER \
--environment_config=IMAGE_URI \
--input=INPUT_FILE \
--output=OUTPUT_FILEVai
go path/to/my/pipeline.go \
--runner=PortableRunner \
--job_endpoint=REGION \
--environment_type=DOCKER \
--environment_config=IMAGE_URI \
--input=INPUT_FILE \
--output=OUTPUT_FILESostituisci quanto segue:
REGION: la regione del servizio job da utilizzare, nel formato indirizzo e porta. Ad esempio:localhost:3000. Utilizzaembedper eseguire un servizio job in-process.IMAGE_URI: l'URI dell'immagine container personalizzata.INPUT_FILE: un file di input che può essere letto come file di testo. Questo file deve essere accessibile dall'immagine container dell'SDK harness
, precaricata sull'immagine container o su un file remoto.OUTPUT_FILE: un percorso in cui scrivere l'output. Questo percorso è un percorso remoto o un percorso locale sul container.
Al termine della pipeline, esamina i log della console per verificare che
la pipeline sia stata completata correttamente e che venga utilizzata l'immagine remota, specificata da
IMAGE_URI.
Dopo aver eseguito la pipeline, i file salvati nel container non si trovano nel file system locale e il container viene arrestato. Puoi copiare i file da
il file system del container arrestato utilizzando
docker cp.
In alternativa:
- Fornisci output a un file system remoto come Cloud Storage. Potresti dover configurare manualmente l'accesso per i test, inclusi i file delle credenziali o le Credenziali predefinite dell'applicazione.
- Per un debug rapido, aggiungi la registrazione temporanea logging.
Utilizzare il runner diretto
Per testare più approfonditamente l'immagine container e la pipeline a livello locale, utilizza il runner diretto di Apache Beam.
Puoi verificare la pipeline separatamente dal container eseguendo i test in un ambiente locale corrispondente all'immagine container o avviando la pipeline su un container in esecuzione.
Java
docker run -it --entrypoint "/bin/bash" IMAGE_URI
...
# On docker container:
root@4f041a451ef3:/# mvn compile exec:java -Dexec.mainClass=com.example.package.MyClassWithMain ...
Python
docker run -it --entrypoint "/bin/bash" IMAGE_URI
...
# On docker container:
root@4f041a451ef3:/# python path/to/my/pipeline.py ...
Vai
docker run -it --entrypoint "/bin/bash" IMAGE_URI
...
# On docker container:
root@4f041a451ef3:/# go path/to/my/pipeline.go ...
Sostituisci IMAGE_URI con l'URI dell'immagine container personalizzata.
Gli esempi presuppongono che tutti i file della pipeline, inclusa la pipeline stessa, si trovino sul container personalizzato, siano stati montati da un file system locale o siano remoti e accessibili da Apache Beam e dal container. Ad esempio, per utilizzare Maven (mvn) per eseguire l'esempio Java precedente, Maven e le relative dipendenze devono essere sottoposti a staging sul container. Per saperne di più, consulta
Archiviazione e
docker run
nella documentazione di Docker.
L'obiettivo dei test sul runner diretto è testare la pipeline nell'ambiente container personalizzato, non testare l'esecuzione del container con il relativo ENTRYPOINT predefinito. Modifica ENTRYPOINT (ad esempio, docker run --entrypoint ...) per eseguire direttamente la pipeline o per consentire l'esecuzione manuale dei comandi sul container.
Se utilizzi una configurazione specifica basata sull'esecuzione del container su Compute Engine, puoi eseguire il container direttamente su una VM Compute Engine. Per saperne di più, consulta Container su Compute Engine.
Avviare il job Dataflow
Quando avvii la pipeline Apache Beam su Dataflow, specifica il percorso dell'immagine container. Non utilizzare il tag :latest con le immagini personalizzate. Assegna ai build un tag con una data o un identificatore univoco. Se si verifica un problema, l'utilizzo di questo tipo di tag potrebbe consentire di ripristinare l'esecuzione della pipeline a una configurazione funzionante nota in precedenza e di ispezionare le modifiche.
Java
Utilizza --sdkContainerImage per specificare un'immagine container dell'SDK per il runtime Java.
Utilizza --experiments=use_runner_v2 per abilitare Runner v2.
Python
Se utilizzi la versione dell'SDK 2.30.0 o successive, utilizza l'opzione della pipeline --sdk_container_image per specificare un'immagine container dell'SDK.
Per le versioni precedenti dell'SDK, utilizza l'opzione della pipeline --worker_harness_container_image per specificare la posizione dell'immagine container da utilizzare per l'SDK harness.
I container personalizzati sono supportati solo per Dataflow Runner v2. Se stai avviando una pipeline Python batch, imposta il flag --experiments=use_runner_v2.
Se stai avviando una pipeline Python di flusso, non è necessario specificare l'esperimento, perché le pipeline Python di flusso utilizzano Runner v2 per impostazione predefinita.
Vai
Se utilizzi la versione dell'SDK 2.40.0 o successive, utilizza l'opzione della pipeline --sdk_container_image per specificare un'immagine container dell'SDK.
Per le versioni precedenti dell'SDK, utilizza l'opzione della pipeline --worker_harness_container_image per specificare la posizione dell'immagine container da utilizzare per l'SDK harness.
I container personalizzati sono supportati in tutte le versioni dell'SDK Go perché utilizzano Dataflow Runner v2 per impostazione predefinita.
L'esempio seguente mostra come avviare l'esempio batch
WordCount esempio
con un container personalizzato.
Java
mvn compile exec:java -Dexec.mainClass=org.apache.beam.examples.WordCount \
-Dexec.args="--runner=DataflowRunner \
--inputFile=INPUT_FILE \
--output=OUTPUT_FILE \
--project=PROJECT_ID \
--region=REGION \
--gcpTempLocation=TEMP_LOCATION \
--diskSizeGb=DISK_SIZE_GB \
--experiments=use_runner_v2 \
--sdkContainerImage=IMAGE_URI"Python
Utilizzando l'SDK Apache Beam per Python versione 2.30.0 o successive:
python -m apache_beam.examples.wordcount \
--input=INPUT_FILE \
--output=OUTPUT_FILE \
--project=PROJECT_ID \
--region=REGION \
--temp_location=TEMP_LOCATION \
--runner=DataflowRunner \
--disk_size_gb=DISK_SIZE_GB \
--experiments=use_runner_v2 \
--sdk_container_image=IMAGE_URIVai
wordcount --input gs://dataflow-samples/shakespeare/kinglear.txt \
--output gs://<your-gcs-bucket>/counts \
--runner dataflow \
--project your-gcp-project \
--region your-gcp-region \
--temp_location gs://<your-gcs-bucket>/tmp/ \
--staging_location gs://<your-gcs-bucket>/binaries/ \
--sdk_container_image=IMAGE_URISostituisci quanto segue:
INPUT_FILE: il percorso di input di Cloud Storage letto da Dataflow durante l'esecuzione dell'esempio.OUTPUT_FILE: il percorso di output di Cloud Storage in cui viene scritta la pipeline di esempio. Questo file contiene i conteggi delle parole.PROJECT_ID: l'ID del tuo Google Cloud progetto.REGION: la regione in cui eseguire il deployment del job Dataflow.TEMP_LOCATION: il percorso di Cloud Storage per Dataflow per eseguire lo staging dei file di job temporanei creati durante l'esecuzione della pipeline.DISK_SIZE_GB: (Facoltativo) Se il container è di grandi dimensioni, valuta la possibilità di aumentare le dimensioni predefinite del disco di avvio per evitare di esaurire lo spazio su disco.IMAGE_URI: l'URI dell'immagine container personalizzata dell'SDK. Utilizza sempre un tag o uno SHA del container con versione. Non utilizzare il tag:latesto un tag modificabile.
Streaming di immagini container
Puoi migliorare la latenza di avvio e scalabilità automatica della pipeline Dataflow abilitando lo streaming di immagini. Questa funzionalità è utile se il container personalizzato contiene contenuti estranei o non utilizza tutti i contenuti a ogni passaggio. Ad esempio, il container potrebbe contenere contenuti incidentali, come il codice della libreria basato sulla CPU per l'inferenza basata sulla GPU. Allo stesso modo, potresti avere un container che esegue pipeline di ML con più modelli che utilizzano un solo modello a ogni passaggio, quindi i relativi contenuti non sono necessari tutti in una volta. L'abilitazione dello streaming di immagini contribuirebbe a migliorare la latenza in questi casi.
Java
--dataflowServiceOptions=enable_image_streaming
Python
--dataflow_service_options=enable_image_streaming
Vai
--dataflow_service_options=enable_image_streaming
Lo streaming di immagini recupererà le parti del container personalizzato di cui ha bisogno il codice della pipeline anziché scaricare l'intero container in anticipo. Le parti del container non utilizzate non devono mai essere scaricate.
Per usufruire dello streaming di immagini, devi aver abilitato l' API Container File System.