Banyak pipeline Apache Beam dapat berjalan menggunakan lingkungan runtime Dataflow default. Namun, beberapa kasus penggunaan pemrosesan data akan lebih baik jika menggunakan library atau class tambahan. Dalam kasus 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 serangkaian 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 tidak boleh berisi library versi campuran.
Masalah dependensi Java
Jika pipeline Anda mengalami 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 (shaded), 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-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 mulai, Anda harus 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. Untuk mempermudah pemeliharaan pipeline, jika kode pipeline Anda mencakup beberapa file, kelompokkan file pipeline sebagai paket Python.
- Tentukan dependensi pipeline dalam file
setup.py
paket Anda. - Siapkan paket untuk pekerja menggunakan opsi pipeline
--setup_file
.
Saat pekerja jarak jauh memulai, 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 root project Anda. Pengelompokan file ini adalah paket Python untuk pipeline Anda. Struktur file terlihat seperti contoh berikut:root_dir/ package_name/ __init__.py 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 menyiapkan 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 ukuran dan kompleksitas kode meningkat. Untuk cara lain dalam menentukan dependensi, lihat Mengelola dependensi pipeline Python dalam dokumentasi Apache Beam.
Menggunakan container kustom untuk mengontrol lingkungan runtime
Untuk menjalankan pipeline dengan Apache Beam Python SDK, pekerja Dataflow memerlukan lingkungan Python yang berisi interpreter, Apache Beam SDK, dan dependensi pipeline. Image container Docker menyediakan lingkungan yang sesuai untuk menjalankan kode pipeline Anda.
Image container standar dirilis dengan setiap versi Apache Beam SDK, dan image ini mencakup 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 harus diinstal saat runtime. Menginstal paket saat runtime dapat menimbulkan 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 sebelumnya memiliki manfaat berikut:
- Memastikan lingkungan runtime pipeline memiliki set dependensi yang sama setiap kali Anda meluncurkan tugas Dataflow.
- Memungkinkan Anda mengontrol lingkungan runtime pipeline.
- Menghindari penyelesaian dependensi yang berpotensi memakan waktu saat startup.
Saat Anda menggunakan image container 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 berfungsi jika diperlukan. - Gunakan lingkungan peluncuran yang kompatibel dengan image container Anda. Untuk panduan selengkapnya tentang penggunaan container kustom, lihat Membangun 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 pipeline versi produksi. Karena lingkungan peluncuran harus kompatibel dengan lingkungan runtime, gunakan versi dependensi yang sama di kedua lingkungan.
Untuk memiliki lingkungan peluncuran yang di-container dan dapat direproduksi, gunakan Template Flex Dataflow. Untuk mengetahui informasi selengkapnya, lihat Membangun dan menjalankan Template Flex. Saat menggunakan Template Flex, 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 selengkapnya, lihat Menetapkan variabel lingkungan Dockerfile yang diperlukan. - Jika Anda menggunakan image container kustom dengan pipeline, berikan image tersebut saat Anda meluncurkan template. Untuk mengetahui informasi selengkapnya, lihat Menggunakan container kustom untuk dependensi.
- Untuk membangun image Docker Template Flex Dataflow, gunakan image container kustom yang sama sebagai image dasar. Untuk mengetahui informasi selengkapnya, lihat Menggunakan image container kustom.
Konstruksi ini membuat lingkungan peluncuran Anda dapat direproduksi dan kompatibel dengan lingkungan runtime Anda.
Untuk contoh yang mengikuti pendekatan ini, lihat tutorial Flex Template 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, 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 mengetahui informasi tentang cara mengelola dependensi untuk pipeline Go, lihat Mengelola dependensi di dokumentasi Go.