Mengelola dependensi pipeline di Dataflow

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

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

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

Cara Anda 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 library yang beragam.

Masalah dependensi Java

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

  • NoClassDefFoundError: Error ini terjadi saat 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.

Pengelolaan dependensi

Untuk 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 mengetahui informasi selengkapnya, lihat dependensi Apache Beam SDK untuk Java dalam dokumentasi Apache Beam.

Untuk menggunakan BOM dengan pipeline 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 menyediakan paket ini dari jarak jauh.
  • Anda ingin membuat lingkungan yang dapat direproduksi.
  • Untuk mengurangi waktu startup, Anda ingin menghindari 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 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.
  • Tahapkan paket ke pekerja menggunakan opsi pipeline --setup_file.

Saat pekerja jarak jauh memulai, mereka akan 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 root project Anda. Pengelompokan file ini adalah paket Python untuk pipeline Anda. Struktur file 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 melakukan staging 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 saat kode berkembang ukuran dan kompleksitasnya. Untuk cara lain 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 Anda.

Image penampung stok dirilis dengan setiap versi Apache Beam SDK, dan image ini menyertakan dependensi Apache Beam SDK. Untuk mengetahui informasi selengkapnya, lihat dependensi Apache Beam SDK untuk Python dalam dokumentasi Apache Beam.

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

  • Waktu startup pekerja meningkat karena resolusi, download, dan penginstalan dependensi.
  • Pipeline memerlukan koneksi ke internet untuk dijalankan.
  • 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 telah menginstal dependensi pipeline secara default memiliki manfaat berikut:

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

Saat Anda menggunakan image penampung kustom, pertimbangkan panduan berikut:

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

Untuk mengetahui detail tentang cara menginstal dependensi Python sebelumnya, lihat Menginstal dependensi Python sebelumnya.

Mengontrol lingkungan peluncuran dengan Template Dataflow

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

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

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

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

Untuk informasi selengkapnya, lihat Membuat 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, Go Modules 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 cara mengelola dependensi untuk pipeline Go, lihat Mengelola dependensi dalam dokumentasi Go.