Menjalankan tugas Dataflow di container kustom memungkinkan Anda menyesuaikan lingkungan runtime worker dan menginstal dependensi pihak ketiga terlebih dahulu. Pendekatan ini membantu memastikan eksekusi pipeline yang konsisten di seluruh workload Anda.
Untuk mengetahui petunjuk cara membuat image, lihat Mem-build image container kustom untuk Dataflow. Untuk mencegah error dari dependensi yang tidak kompatibel saat Anda meluncurkan pipeline, gunakan versi Apache Beam SDK dan versi bahasa yang cocok dengan SDK pada image container kustom Anda.
Menguji secara lokal
Sebelum menjalankan pipeline di Dataflow, sebaiknya uji image container secara lokal, sehingga pengujian dan proses debug dapat dilakukan lebih cepat.
Untuk mempelajari lebih lanjut penggunaan khusus Apache Beam, lihat panduan Apache Beam untuk Menjalankan pipeline dengan image container kustom.
Pengujian dasar dengan PortableRunner
Untuk memverifikasi bahwa image container jarak jauh dapat ditarik dan dapat menjalankan pipeline dasar, gunakan PortableRunner Apache Beam. Saat Anda menggunakan
PortableRunner, pengiriman tugas terjadi di lingkungan lokal, dan
eksekusi DoFn terjadi di lingkungan Docker.
Saat Anda menggunakan GPU, container Docker mungkin tidak memiliki akses ke GPU. Untuk menguji container dengan GPU, gunakan runner langsung dan ikuti langkah-langkah untuk menguji image container di VM mandiri dengan GPU di bagian Men-debug dengan VM mandiri di halaman "Menggunakan GPU".
Berikut ini adalah contoh menjalankan pipeline:
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_FILEGo
go path/to/my/pipeline.go \
--runner=PortableRunner \
--job_endpoint=REGION \
--environment_type=DOCKER \
--environment_config=IMAGE_URI \
--input=INPUT_FILE \
--output=OUTPUT_FILEGanti kode berikut:
REGION: region layanan tugas yang akan digunakan, dalam bentuk alamat dan port. Contoh:localhost:3000. Gunakanembeduntuk menjalankan layanan tugas dalam proses.IMAGE_URI: URI image container kustom.INPUT_FILE: file input yang dapat dibaca sebagai file teks. File ini harus dapat diakses oleh image container
harness SDK, baik yang telah dimuat sebelumnya di image container maupun file jarak jauh.OUTPUT_FILE: jalur untuk menulis output. Jalur ini adalah jalur jarak jauh atau jalur lokal pada container.
Setelah pipeline berhasil diselesaikan, tinjau log konsol untuk memverifikasi bahwa
pipeline berhasil diselesaikan dan image jarak jauh, yang ditentukan oleh
IMAGE_URI, digunakan.
Setelah menjalankan pipeline, file yang disimpan ke container tidak ada dalam sistem file lokal Anda, dan container dihentikan. Anda dapat menyalin file dari
sistem file container yang dihentikan menggunakan
docker cp.
Sebagai alternatif:
- Memberikan output ke sistem file jarak jauh seperti Cloud Storage. Anda mungkin perlu mengonfigurasi akses secara manual untuk tujuan pengujian, termasuk untuk file kredensial atau Kredensial Default Aplikasi.
- Untuk proses debug cepat, tambahkan logging sementara.
Menggunakan Direct Runner
Untuk pengujian lokal yang lebih mendalam terhadap image container dan pipeline Anda, gunakan Direct Runner Apache Beam.
Anda dapat memverifikasi pipeline secara terpisah dari container dengan menguji di lingkungan lokal yang cocok dengan image container, atau dengan meluncurkan pipeline pada container yang sedang berjalan.
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 ...
Go
docker run -it --entrypoint "/bin/bash" IMAGE_URI
...
# On docker container:
root@4f041a451ef3:/# go path/to/my/pipeline.go ...
Ganti IMAGE_URI dengan URI image container kustom.
Contoh ini mengasumsikan bahwa file pipeline apa pun, termasuk pipeline itu sendiri, berada di container kustom, telah dipasang dari sistem file lokal, atau bersifat jarak jauh dan dapat diakses oleh Apache Beam dan container. Misalnya, untuk menggunakan
Maven (mvn) guna menjalankan contoh Java sebelumnya, Maven dan
dependensinya harus di-stage di container. Untuk mengetahui informasi selengkapnya, lihat
Penyimpanan dan
docker run
dalam dokumentasi Docker.
Tujuan pengujian di Direct Runner adalah untuk menguji pipeline Anda di lingkungan container kustom, bukan untuk menguji menjalankan container dengan ENTRYPOINT default-nya. Ubah ENTRYPOINT (misalnya,
docker run --entrypoint ...) untuk menjalankan pipeline secara langsung atau mengizinkan
menjalankan perintah secara manual pada container.
Jika Anda mengandalkan konfigurasi tertentu yang didasarkan pada menjalankan container di Compute Engine, Anda dapat menjalankan container langsung di VM Compute Engine. Untuk mengetahui informasi selengkapnya, lihat Container di Compute Engine.
Meluncurkan tugas Dataflow
Saat meluncurkan pipeline Apache Beam di Dataflow, tentukan
jalur ke image container. Jangan gunakan tag :latest dengan image kustom Anda. Beri tag pada build Anda dengan tanggal atau ID unik. Jika terjadi kesalahan, penggunaan jenis tag ini dapat memungkinkan pengembalian eksekusi pipeline ke konfigurasi kerja yang diketahui sebelumnya dan memungkinkan pemeriksaan perubahan.
Java
Gunakan --sdkContainerImage untuk menentukan image container SDK untuk runtime Java Anda.
Untuk mengaktifkan Portable Runner, gunakan eksperimen berikut berdasarkan versi SDK Anda:
- Apache Beam SDK 2.74 atau yang lebih baru:
--experiments=enable_portable_runner. - Apache Beam SDK 2.73 atau yang lebih lama:
--experiments=use_runner_v2.
Python
Jika menggunakan SDK versi 2.30.0 atau yang lebih baru, gunakan opsi pipeline --sdk_container_image untuk menentukan image container SDK.
Untuk versi SDK yang lebih lama, gunakan opsi pipeline --worker_harness_container_image untuk menentukan lokasi image container yang akan digunakan untuk worker harness.
Container kustom hanya didukung untuk Runner Portabel Dataflow. Jika Anda meluncurkan pipeline Python batch, tetapkan flag eksperimen berdasarkan versi SDK Anda:
- Apache Beam SDK 2.74 atau yang lebih baru:
--experiments=enable_portable_runner. - Apache Beam SDK 2.73 atau yang lebih lama:
--experiments=use_runner_v2.
Jika Anda meluncurkan pipeline Python streaming, Anda tidak perlu menentukan eksperimen, karena pipeline Python streaming menggunakan Portable Runner secara default.
Go
Jika menggunakan SDK versi 2.40.0 atau yang lebih baru, gunakan opsi pipeline --sdk_container_image untuk menentukan image container SDK.
Untuk versi SDK yang lebih lama, gunakan opsi pipeline --worker_harness_container_image untuk menentukan lokasi image container yang akan digunakan untuk worker harness.
Container kustom didukung di semua versi Go SDK karena menggunakan Runner Portabel Dataflow secara default.
Contoh berikut menunjukkan cara meluncurkan contoh WordCount batch dengan container kustom.
Java
mvn -Pdataflow-runner 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
Menggunakan Apache Beam SDK untuk Python versi 2.30.0 atau yang lebih baru:
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_URIGo
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_URIGanti kode berikut:
INPUT_FILE: jalur input Cloud Storage yang dibaca oleh Dataflow saat menjalankan contoh.OUTPUT_FILE: jalur output Cloud Storage yang ditulis oleh contoh pipeline. File ini berisi jumlah kata.PROJECT_ID: ID project Google Cloud Anda.REGION: region untuk men-deploy tugas Dataflow Anda.TEMP_LOCATION: jalur Cloud Storage untuk Dataflow guna men-stage file tugas sementara yang dibuat selama eksekusi pipeline.DISK_SIZE_GB: Opsional. Jika container Anda berukuran besar, pertimbangkan untuk meningkatkan ukuran boot disk default untuk menghindari kehabisan kapasitas disk.IMAGE_URI: URI image container kustom SDK. Selalu gunakan SHA atau tag container berversi. Jangan gunakan tag:latestatau tag yang dapat diubah.
Streaming image container
Anda dapat meningkatkan latensi startup dan penskalaan otomatis pipeline Dataflow dengan mengaktifkan streaming image. Fitur ini berguna jika container kustom Anda berisi konten yang tidak relevan atau tidak menggunakan semua kontennya di setiap langkah. Misalnya, container Anda mungkin berisi konten insidental seperti kode library berbasis CPU untuk inferensi berbasis GPU. Demikian pula, Anda mungkin memiliki container yang menjalankan pipeline ML dengan beberapa model yang hanya menggunakan satu model di setiap langkah, sehingga kontennya tidak diperlukan sekaligus. Mengaktifkan streaming gambar akan membantu meningkatkan latensi dalam kasus ini.
Java
--dataflowServiceOptions=enable_image_streaming
Python
--dataflow_service_options=enable_image_streaming
Go
--dataflow_service_options=enable_image_streaming
Streaming image akan mengambil bagian-bagian container kustom Anda sesuai kebutuhan kode pipeline, bukan mendownload seluruh container di awal. Bagian container yang tidak digunakan tidak perlu didownload.
Anda harus mengaktifkan Container File System API untuk mendapatkan manfaat dari streaming image.