Menjalankan tugas Dataflow dalam penampung kustom

Dokumen ini menjelaskan cara menjalankan pipeline Dataflow menggunakan container kustom.

Untuk mengetahui informasi tentang cara membuat image container, lihat Membangun image container kustom untuk Dataflow.

Saat menjalankan pipeline, luncurkan pipeline menggunakan Apache Beam SDK dengan versi dan versi bahasa yang sama seperti SDK pada image container kustom Anda. Langkah ini menghindari error yang tidak terduga dari dependensi atau SDK yang tidak kompatibel.

Menguji secara lokal

Sebelum menjalankan pipeline di Dataflow, sebaiknya uji image container secara lokal, yang memungkinkan pengujian dan proses debug yang 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 sederhana, 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 peluncur langsung dan ikuti langkah-langkah untuk menguji image container di VM mandiri dengan GPU di bagian Men-debug dengan VM mandiri pada halaman "Menggunakan GPU".

Berikut menjalankan contoh 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_FILE

Go

go path/to/my/pipeline.go \
  --runner=PortableRunner \
  --job_endpoint=REGION \
  --environment_type=DOCKER \
  --environment_config=IMAGE_URI \
  --input=INPUT_FILE \
  --output=OUTPUT_FILE

Ganti kode berikut:

  • REGION: region layanan tugas yang akan digunakan, dalam bentuk alamat dan port. Contoh: localhost:3000. Gunakan embed untuk 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 sudah dimuat sebelumnya di image container atau file jarak jauh.
  • OUTPUT_FILE: jalur untuk menulis output. Jalur ini bisa berupa jalur jarak jauh atau jalur lokal di 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 di sistem file lokal Anda, dan container dihentikan. Anda dapat menyalin file dari sistem file container yang dihentikan menggunakan docker cp.

Sebagai alternatif:

  • Menyediakan 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 pada image container dan pipeline Anda, gunakan Direct Runner Apache Beam.

Anda dapat memverifikasi pipeline secara terpisah dari container dengan melakukan pengujian 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 mengasumsikan bahwa semua file pipeline, termasuk pipeline itu sendiri, berada di penampung kustom, telah di-mount dari sistem file lokal, atau berada di jarak jauh dan dapat diakses oleh Apache Beam dan penampung. Misalnya, untuk menggunakan Maven (mvn) guna menjalankan contoh Java sebelumnya, Maven dan dependensinya harus di-stage di container. Untuk mengetahui informasi selengkapnya, lihat Storage 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 perintah yang dijalankan secara manual di container.

Jika 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 Kontainer di Compute Engine.

Luncurkan tugas Dataflow

Saat meluncurkan pipeline Apache Beam di Dataflow, tentukan jalur ke image container. Jangan gunakan tag :latest dengan gambar kustom Anda. Beri tag pada build Anda dengan tanggal atau ID unik. Jika terjadi masalah, penggunaan jenis tag ini dapat memungkinkan pemulihan eksekusi pipeline ke konfigurasi yang sebelumnya diketahui berfungsi dan memungkinkan pemeriksaan perubahan.

Java

Gunakan --sdkContainerImage untuk menentukan image container SDK untuk runtime Java Anda.

Gunakan --experiments=use_runner_v2 untuk mengaktifkan 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 SDK versi sebelumnya, gunakan opsi pipeline --worker_harness_container_image untuk menentukan lokasi image container yang akan digunakan untuk harness pekerja.

Container kustom hanya didukung untuk Dataflow Runner v2. Jika Anda meluncurkan pipeline Python batch, tetapkan tanda --experiments=use_runner_v2. Jika Anda meluncurkan pipeline Python streaming, penentuan eksperimen tidak diperlukan, karena pipeline Python streaming menggunakan Runner v2 secara default.

Go

Jika menggunakan SDK versi 2.40.0 atau yang lebih baru, gunakan opsi pipeline --sdk_container_image untuk menentukan image penampung SDK.

Untuk SDK versi sebelumnya, gunakan opsi pipeline --worker_harness_container_image untuk menentukan lokasi image container yang akan digunakan untuk harness pekerja.

Penampung kustom didukung di semua versi Go SDK karena menggunakan Dataflow Runner v2 secara default.

Contoh berikut menunjukkan cara meluncurkan contoh batch WordCount dengan container kustom.

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

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_URI

Go

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

Ganti kode berikut:

  • INPUT_FILE: jalur input Cloud Storage yang dibaca oleh Dataflow saat menjalankan contoh.
  • OUTPUT_FILE: jalur output Cloud Storage yang ditulis oleh pipeline contoh. File ini berisi jumlah kata.
  • PROJECT_ID: ID project Google Cloud Anda.
  • REGION: region tempat men-deploy tugas Dataflow Anda.
  • TEMP_LOCATION: jalur Cloud Storage agar Dataflow dapat menyimpan file tugas sementara yang dibuat selama eksekusi pipeline.
  • DISK_SIZE_GB: Opsional. Jika penampung Anda berukuran besar, pertimbangkan untuk menambah ukuran disk booting default untuk menghindari kehabisan ruang disk.
  • IMAGE_URI: URI image container kustom SDK. Selalu gunakan SHA atau tag penampung versi. Jangan gunakan tag :latest atau tag yang dapat berubah.

Streaming image container

Anda dapat meningkatkan latensi startup dan penskalaan otomatis pipeline Dataflow dengan mengaktifkan streaming image. Fitur ini berguna jika penampung kustom Anda berisi konten yang tidak relevan atau tidak menggunakan semua kontennya di setiap langkah. Misalnya, penampung Anda dapat berisi konten insidental seperti kode library berbasis CPU untuk inferensi berbasis GPU. Demikian pula, Anda mungkin memiliki penampung yang menjalankan pipeline ML dengan beberapa model yang hanya menggunakan satu model di setiap langkah, sehingga isinya 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 dari container kustom Anda sesuai kebutuhan kode pipeline Anda, bukan mendownload seluruh container Anda di awal. Bagian penampung yang tidak digunakan tidak perlu didownload.

Anda harus mengaktifkan Container File System API untuk mendapatkan manfaat dari streaming image.