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:
Buat file
setup.py
untuk project Anda. Dalam filesetup.py
, sertakan argumeninstall_requires
untuk menentukan kumpulan dependensi minimal untuk pipeline Anda. Contoh berikut menunjukkan filesetup.py
dasar.import setuptools setuptools.setup( name='PACKAGE_NAME', version='PACKAGE_VERSION', install_requires=[], packages=setuptools.find_packages(), )
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
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:
- Jika Anda mengonfigurasi pipeline sebagai paket, instal paket di Dockerfile template Anda.
Untuk mengonfigurasi Template Flex, tentukan
FLEX_TEMPLATE_PYTHON_SETUP_FILE
. Untuk mengetahui informasi lebih lanjut, lihat Menetapkan variabel lingkungan Dockerfile yang diperlukan. - Jika Anda menggunakan image container kustom dengan pipeline, berikan image tersebut saat meluncurkan template. Untuk mengetahui informasi selengkapnya, lihat Menggunakan container kustom untuk dependensi.
- Untuk membangun image Docker Template Dataflow Flex, gunakan image container kustom yang sama dengan image dasar. Untuk mengetahui informasi lebih lanjut, lihat Menggunakan image container kustom.
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.