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:
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/ 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 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:
- Jika Anda mengonfigurasi pipeline sebagai paket, instal paket di Dockerfile template Anda.
Untuk mengonfigurasi Template Flex, tentukan
FLEX_TEMPLATE_PYTHON_SETUP_FILE
. Untuk informasi selengkapnya, lihat Menetapkan variabel lingkungan Dockerfile yang diperlukan. - Jika Anda menggunakan image container kustom dengan pipeline, berikan image tersebut saat meluncurkan template. Untuk informasi selengkapnya, lihat Menggunakan penampung kustom untuk dependensi.
- Untuk mem-build image Docker Template Flex Dataflow, gunakan image container kustom yang sama sebagai image dasar. Untuk informasi selengkapnya, lihat Menggunakan image penampung kustom.
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.