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 nell'immagine container personalizzata. Questo passaggio evita errori imprevisti dovuti a SDK o dipendenze incompatibili.
Testare localmente
Prima di eseguire la pipeline in Dataflow, è consigliabile testare l'immagine container localmente, il che consente test e debug più rapidi.
Per saperne 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 semplice pipeline, 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 Direct Runner 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".
Il seguente comando esegue 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_FILE
Vai
go path/to/my/pipeline.go \
--runner=PortableRunner \
--job_endpoint=REGION \
--environment_type=DOCKER \
--environment_config=IMAGE_URI \
--input=INPUT_FILE \
--output=OUTPUT_FILE
Sostituisci quanto segue:
REGION
: la regione del servizio di job da utilizzare, sotto forma di indirizzo e porta. Ad esempio:localhost:3000
. Utilizzaembed
per eseguire un servizio di 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 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 l'esecuzione della pipeline, i file salvati nel container non si trovano nel file system locale e il container viene arrestato. Puoi copiare i file dal 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 a scopo di test, inclusi i file delle credenziali o le credenziali predefinite dell'applicazione.
- Per un debug rapido, aggiungi registrazione temporanea.
Utilizzare Direct Runner
Per test locali più approfonditi dell'immagine container e della pipeline, utilizza Direct Runner di Apache Beam.
Puoi verificare la pipeline separatamente dal container eseguendo 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 preparati sul container. Per saperne di più, consulta Archiviazione e docker run
nella documentazione di Docker.
L'obiettivo dei test su Direct Runner è testare la pipeline
nell'ambiente del 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 ti affidi a 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 Contenitori su Compute Engine.
Avvia il job Dataflow
Quando avvii la pipeline Apache Beam su Dataflow, specifica
il percorso dell'immagine container. Non utilizzare il tag :latest
con le tue immagini personalizzate. Assegna ai tuoi build un tag con una data o un identificatore univoco. Se qualcosa va
storto, l'utilizzo di questo tipo di tag potrebbe consentire di ripristinare l'esecuzione della pipeline
a una configurazione funzionante nota in precedenza e consentire un'
ispezione delle modifiche.
Java
Utilizza --sdkContainerImage
per specificare un'immagine container SDK per il runtime Java.
Utilizza --experiments=use_runner_v2
per abilitare Runner v2.
Python
Se utilizzi la versione 2.30.0 o successive dell'SDK, 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 il worker harness.
I container personalizzati sono supportati solo per Dataflow Runner v2. Se
avvii una pipeline Python batch, imposta il flag --experiments=use_runner_v2
.
Se avvii una pipeline Python di streaming, non è necessario specificare l'esperimento, perché le pipeline Python di streaming 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 del 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 il worker 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 di WordCount
batch 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_URI
Vai
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_URI
Sostituisci 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 scritto dalla pipeline di esempio. Questo file contiene i conteggi delle parole.PROJECT_ID
: l'ID del tuo progetto Google Cloud.REGION
: la regione in cui eseguire il deployment del job Dataflow.TEMP_LOCATION
: il percorso Cloud Storage in cui Dataflow esegue il provisioning dei file di job temporanei creati durante l'esecuzione della pipeline.DISK_SIZE_GB
: (Facoltativo) Se il contenitore è 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 un hash SHA del contenitore con controllo delle versioni. Non utilizzare il tag:latest
o un tag modificabile.
Streaming delle immagini container
Puoi migliorare la latenza di avvio e scalabilità automatica della pipeline Dataflow attivando lo streaming di immagini. Questa funzionalità è utile se il contenitore personalizzato contiene contenuti estranei o non utilizza tutti i contenuti in ogni passaggio. Ad esempio, il tuo container potrebbe contenere contenuti incidentali come codice di libreria basato sulla CPU per l'inferenza basata sulla GPU. Allo stesso modo, potresti avere un container che esegue pipeline ML con più modelli che utilizzano un solo modello in ogni passaggio, quindi i suoi contenuti non sono necessari tutti in una volta. L'attivazione dello streaming delle 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 delle 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 contenitore che non vengono utilizzate non devono mai essere scaricate.
Per usufruire dello streaming delle immagini, devi aver abilitato l' API Container File System.