Mengelola dependensi pipeline di Dataflow

Banyak pipeline Apache Beam dapat berjalan menggunakan lingkungan runtime Dataflow default. Namun, beberapa kasus penggunaan pemrosesan data dapat memanfaatkan penggunaan library atau class tambahan. Dalam hal ini, Anda mungkin perlu mengelola dependensi pipeline.

Daftar berikut memberikan beberapa alasan mengapa Anda mungkin perlu mengelola dependensi pipeline:

  • Dependensi yang disediakan oleh lingkungan runtime default tidak cukup untuk kasus penggunaan Anda.
  • Dependensi default memiliki konflik versi atau memiliki class dan library yang tidak kompatibel dengan kode pipeline Anda.
  • Anda perlu menyematkan versi library tertentu untuk pipeline Anda.
  • Anda memiliki pipeline Python yang perlu dijalankan dengan kumpulan dependensi yang konsisten.

Cara mengelola dependensi bergantung pada apakah pipeline Anda menggunakan Java, Python, atau Go.

Java

Class dan library yang tidak kompatibel dapat menyebabkan masalah dependensi Java. Jika pipeline Anda berisi kode dan setelan khusus pengguna, kode tersebut tidak boleh berisi versi campuran library.

Masalah dependensi Java

Jika pipeline Anda memiliki masalah dependensi Java, salah satu error berikut mungkin akan terjadi:

  • NoClassDefFoundError: Error ini terjadi jika seluruh class tidak tersedia selama runtime.
  • NoSuchMethodError: Error ini terjadi saat class di classpath menggunakan versi yang tidak berisi metode yang benar atau saat tanda tangan metode berubah.
  • NoSuchFieldError: Error ini terjadi saat class di classpath menggunakan versi yang tidak memiliki kolom yang diperlukan selama runtime.
  • FATAL ERROR: Error ini terjadi saat dependensi bawaan tidak dapat dimuat dengan benar. Saat menggunakan file JAR uber (diarsir), jangan sertakan library yang menggunakan tanda tangan dalam file JAR yang sama, seperti Conscrypt.

Manajemen ketergantungan

Guna menyederhanakan pengelolaan dependensi untuk pipeline Java, Apache Beam menggunakan artefak Bill of Materials (BOM). BOM membantu alat pengelolaan dependensi memilih kombinasi dependensi yang kompatibel. Untuk informasi selengkapnya, lihat Apache Beam SDK untuk dependensi Java dalam dokumentasi Apache Beam.

Untuk menggunakan BOM dengan pipeline Anda dan menambahkan dependensi lain secara eksplisit ke daftar dependensi, tambahkan informasi berikut ke file pom.xml untuk artefak SDK. Untuk mengimpor BOM library yang benar, gunakan beam-sdks-java-io-google-cloud-platform-bom.

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.apache.beam</groupId>
      <artifactId>beam-sdks-java-google-cloud-platform-bom</artifactId>
      <version>LATEST</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

<dependencies>
  <dependency>
    <groupId>org.apache.beam</groupId>
    <artifactId>beam-sdks-java-core</artifactId>
  </dependency>
  <dependency>
    <groupId>org.apache.beam</groupId>
    <artifactId>beam-runners-google-cloud-dataflow-java</artifactId>
  </dependency>
  <dependency>
    <groupId>org.apache.beam</groupId>
    <artifactId>beam-sdks-java-io-google-cloud-platform</artifactId>
  </dependency>
</dependencies>

Artefak beam-sdks-java-core hanya berisi SDK inti. Anda perlu menambahkan dependensi lain secara eksplisit, seperti I/O dan runner, ke daftar dependensi.

Python

Saat Anda menjalankan tugas Dataflow menggunakan Apache Beam Python SDK, pengelolaan dependensi berguna dalam skenario berikut:

  • Pipeline Anda menggunakan paket publik dari Python Package Index (PiPy), dan Anda ingin membuat paket ini tersedia dari jarak jauh.
  • Anda ingin membuat lingkungan yang dapat direproduksi.
  • Untuk mengurangi waktu startup, sebaiknya hindari penginstalan dependensi pada pekerja saat runtime.

Menentukan dependensi pipeline Python

Meskipun Anda dapat menggunakan satu skrip atau notebook Python untuk menulis pipeline Apache Beam, dalam ekosistem Python, software sering didistribusikan sebagai paket. Agar pipeline Anda lebih mudah dikelola, saat kode pipeline Anda mencakup beberapa file, kelompokkan file pipeline sebagai paket Python.

  • Tentukan dependensi pipeline dalam file setup.py paket Anda.
  • Stage paket ke pekerja menggunakan opsi pipeline --setup_file.

Ketika pekerja jarak jauh mulai, mereka menginstal paket Anda. Sebagai contoh, lihat juliaset di GitHub Apache Beam.

Untuk menyusun pipeline sebagai paket Python, ikuti langkah-langkah berikut:

  1. Buat file setup.py untuk project Anda. Dalam file setup.py, sertakan argumen install_requires untuk menentukan kumpulan dependensi minimal untuk pipeline Anda. Contoh berikut menunjukkan file setup.py dasar.

    import setuptools
    
    setuptools.setup(
      name='PACKAGE_NAME',
      version='PACKAGE_VERSION',
      install_requires=[],
      packages=setuptools.find_packages(),
    )
    
  2. Tambahkan file setup.py, file alur kerja utama, dan direktori dengan file lainnya ke direktori utama project Anda. Pengelompokan file ini adalah paket Python untuk pipeline Anda. Struktur filenya terlihat seperti contoh berikut:

    root_dir/
      package_name/
        my_pipeline_launcher.py
        my_custom_transforms.py
        ...other files...
      setup.py
      main.py
    
  3. Untuk menjalankan pipeline, instal paket di lingkungan pengiriman. Gunakan opsi pipeline --setup_file untuk mengatur paket ke pekerja. Contoh:

    python -m pip install -e .
    python main.py --runner DataflowRunner --setup_file ./setup.py  <...other options...>
    

Langkah-langkah ini menyederhanakan pemeliharaan kode pipeline, terutama ketika ukuran dan kompleksitas kode bertambah. Untuk mengetahui cara lain dalam menentukan dependensi, lihat Mengelola dependensi pipeline Python dalam dokumentasi Apache Beam.

Menggunakan penampung kustom untuk mengontrol lingkungan runtime

Untuk menjalankan pipeline dengan Apache Beam Python SDK, pekerja Dataflow memerlukan lingkungan Python yang berisi penafsir, Apache Beam SDK, dan dependensi pipeline. Image container Docker menyediakan lingkungan yang sesuai untuk menjalankan kode pipeline.

Image container stok dirilis dengan setiap versi Apache Beam SDK, dan gambar ini mencakup dependensi Apache Beam SDK. Untuk informasi selengkapnya, lihat Apache Beam SDK untuk dependensi Python dalam dokumentasi Apache Beam.

Jika pipeline Anda memerlukan dependensi yang tidak disertakan dalam image container default, dependensi harus diinstal saat runtime. Menginstal paket saat runtime dapat menimbulkan konsekuensi berikut:

  • Waktu startup pekerja meningkat karena resolusi dependensi, download, dan penginstalan.
  • Pipeline memerlukan koneksi ke internet agar dapat berjalan.
  • Non-determinisme terjadi karena rilis software dalam dependensi.

Untuk menghindari masalah ini, sediakan lingkungan runtime dalam image container Docker kustom. Menggunakan image container Docker kustom yang memiliki dependensi pipeline yang telah diinstal sebelumnya memiliki manfaat sebagai berikut:

  • Memastikan lingkungan runtime pipeline memiliki kumpulan dependensi yang sama setiap kali Anda meluncurkan tugas Dataflow.
  • Memungkinkan Anda mengontrol lingkungan runtime pipeline Anda.
  • Menghindari resolusi dependensi yang berpotensi memakan waktu saat startup.

Saat Anda menggunakan image container kustom, pertimbangkan panduan berikut:

  • Hindari penggunaan tag :latest pada gambar kustom Anda. Beri tag pada build Anda dengan tanggal, versi, atau ID unik. Langkah ini memungkinkan Anda kembali ke konfigurasi kerja yang diketahui jika diperlukan.
  • Gunakan lingkungan peluncuran yang kompatibel dengan image container Anda. Untuk panduan lebih lanjut tentang menggunakan container kustom, lihat Membuat image container.

Untuk mengetahui detail tentang cara menginstal dependensi Python terlebih dahulu, lihat Pra-penginstalan dependensi Python.

Mengontrol lingkungan peluncuran dengan Template Dataflow

Jika pipeline memerlukan dependensi tambahan, Anda mungkin perlu menginstalnya di lingkungan runtime dan lingkungan peluncuran. Lingkungan peluncuran menjalankan pipeline versi produksi. Karena lingkungan peluncuran harus kompatibel dengan lingkungan runtime, gunakan versi dependensi yang sama di kedua lingkungan.

Untuk memiliki lingkungan peluncuran dalam container yang dapat direproduksi, gunakan Template Dataflow Flex. Untuk mengetahui informasi selengkapnya, lihat Membuat dan menjalankan Template Fleksibel. Saat menggunakan Template Fleksibel, pertimbangkan faktor-faktor berikut:

Konstruksi ini membuat lingkungan peluncuran Anda dapat direproduksi dan kompatibel dengan lingkungan runtime.

Untuk contoh yang mengikuti pendekatan ini, lihat tutorial Template Fleksibel untuk pipeline dengan dependensi dan container kustom di GitHub.

Untuk mengetahui informasi selengkapnya, lihat Menjadikan lingkungan peluncuran kompatibel dengan lingkungan runtime dan Mengontrol dependensi yang digunakan pipeline dalam dokumentasi Apache Beam.

Go

Saat Anda menjalankan tugas Dataflow menggunakan Apache Beam Go SDK, Modul Go digunakan untuk mengelola dependensi. File berikut berisi dependensi kompilasi dan runtime default yang digunakan oleh pipeline Anda:

https://raw.githubusercontent.com/apache/beam/vVERSION_NUMBER/sdks/go.sum

Ganti VERSION_NUMBER dengan versi SDK yang Anda gunakan.

Untuk informasi tentang mengelola dependensi untuk pipeline Go, lihat Mengelola dependensi dalam dokumentasi Go.