Posted on


Hampir setiap kerangka kerja pemrosesan data besar mendukung SDK dalam berbagai bahasa dan seringkali SDK tersebut akan memiliki perbedaan dalam fitur dan transformasi yang didukung. Ini adalah tantangan bagi pengembang SDK untuk menjaga kualitas dan kinerja perangkat lunak yang konsisten di seluruh bahasa pemrograman yang ingin mereka dukung. Demikian pula para insinyur data perlu memastikan bahwa mereka memilih bahasa pemrograman yang tepat SDK untuk kasus penggunaannya.

Apache Beam memperkenalkan konsep yang disebut Portability Framework untuk mengatasi tantangan ini dengan memungkinkan insinyur data untuk mencampur dan mencocokkan fungsionalitas yang disediakan oleh SDK dalam berbagai bahasa ke dalam pipa data tunggal.

Di posting blog ini, saya akan membahas topik -topik berikut:

  • Mengapa Portabilitas Penting?
  • Pendekatan balok terhadap portabilitas
  • Pipa multi-bahasa
  • DataFlow Runner V2

Jika Anda tidak terbiasa dengan Apache Beam, saya sarankan mulai dengan ikhtisar balok Apache.

Mengapa Portabilitas Penting?

Ada beberapa alasan teknis dan non-teknis, tetapi pada tingkat tinggi:

  1. Anda harus dapat menjalankan pipa Anda di beberapa mesin eksekusi atau pelari. Anda mungkin ingin menjalankannya di mesin Google Cloud Dataflow jika CSP pilihan Anda adalah Google atau menggunakan Flink pada AWS dan On-Premise.
  1. Kelompok insinyur data dan ilmuwan data mungkin ingin menggunakan bahasa pemrograman yang berbeda. Satu kelompok mungkin lebih menyukai Java daripada Python atau sebaliknya dan idealnya Anda tidak perlu menulis transformasi yang sama di berbagai bahasa untuk meningkatkan produktivitas.
  1. Beberapa bahasa pemrograman memiliki dukungan yang lebih baik untuk jenis perpustakaan misalnya Python memiliki dukungan yang sangat kuat untuk perpustakaan pembelajaran mesin seperti TensorFlow dan Pytorch. Anda tidak perlu menulis ulang jaringan pipa Java Anda untuk memanfaatkan perpustakaan ini.
  1. Dan akhirnya Anda ingin meningkatkan kecepatan pengiriman perangkat lunak dan itu berarti menggunakan kembali kode yang ditulis oleh berbagai kelompok pengembang yang menggunakan bahasa pemrograman yang berbeda baik di dalam organisasi Anda atau tersedia sebagai open source.

Singkatnya, portabilitas harus meningkatkan kolaborasi di seluruh kelompok pengembangan, meningkatkan kecepatan pengembang dan mengurangi keseluruhan biaya pengembangan dan pemeliharaan pipa.

Dalam posting blog ini, saya akan mencoba dan menjelaskan bagaimana balok berurusan dengan portabilitas dari sudut pandang tiga persona:

  1. Insinyur membangun pelari baru dan ingin menjadikannya SDK independen
  2. Insinyur data yang ingin membuat transformasi mereka tersedia di berbagai bahasa
  3. Insinyur data yang ingin menggunakan transformasi dari berbagai bahasa dalam pipa mereka.

Balok mendukung portabilitas dalam dua cara:

Anda mengembangkan pipa sekali dan Anda dapat berlari di mana saja menggunakan salah satu pelari yang didukung.

Set pelari yang didukung saat ini adalah:

Flink, Spark, Google Dataflow, Twister, Hazelcast, Nemo dll. Selain itu juga mendukung Directrunner yang sangat berguna untuk pengembangan pipa.

Dan kedua, mendukung SDK dalam beberapa bahasa pemrograman untuk mengembangkan jaringan pipa. Yang paling umum dan fitur kaya adalah Java diikuti oleh Python, SQL dan Go. Selain itu, API Scala yang disebut Scio telah dikembangkan oleh para insinyur di Spotify.

Salah satu cara mendukung beberapa bahasa SDK di seluruh set mesin run time (pelari) adalah dengan mengimplementasikan setiap transformasi pada semua SDK bahasa yang didukung dan pada semua pelari yang didukung.

Misalnya, jika Anda memiliki serangkaian transformasi misalnya BigQuery IO atau Kafka IO, pengembang transformasi perlu mengimplementasikannya di Java dan Python dan pergi dan sebagainya …

Dan kemudian pelari harus mendukung transformasi tersebut untuk setiap SDK.

Dengan asumsi Anda memiliki M transformasi yang ingin Anda dukung N bahasa pemrograman yang berbeda dan ingin mendukung P Jumlah pelari, dengan sangat cepat menjadi masalah yang tidak bisa diselesaikan.

Diagram berikut menunjukkan kompleksitas.

Pembicaraan Maximilian Michels tentang topik ini cukup komprehensif dan patut ditonton.

Pendekatan balok terhadap portabilitas

Seperti disebutkan di atas, saya akan membahas pipa multi-bahasa dari sudut pandang tiga persona yang berbeda. Yang pertama adalah kelompok insinyur yang membangun pelari baru dan ingin menjadikannya SDK independen. Bagi mereka Panduan Penulisan Pelari berisi informasi yang diperlukan, tetapi pada balok tingkat tinggi telah memperkenalkan dua lapisan API yang memungkinkan mereka untuk membuat pelari independen SDK sehingga dapat mengeksekusi transformasi yang ditulis dalam beberapa bahasa yang didukung. Dua API spesifik adalah FN API dan Runner API.

Runner API adalah skema independen SDK dan antarmuka RPC untuk meluncurkan pipa dan memeriksa status pekerjaan. Dan tugas FN API adalah untuk memberikan kemampuan untuk memohon UDF dari pipa pengguna.

Kelompok insinyur kedua adalah mereka yang mengembangkan transformasi dalam satu bahasa (misalnya Java) dan ingin menggunakan kerangka kerja portabilitas untuk membuat transformasi mereka tersedia untuk SDK bahasa lain (misalnya Python). Saat ini ada beberapa transformasi seperti itu dan Anda dapat menemukan ini terdaftar sebagai “Via X-Language” di halaman konektor I/O yang bawaan Apache. Salah satu contohnya adalah Kafkaio yang ditulis dalam Java tetapi tersedia dalam Python.

Untuk membuat transformasi Java tersedia untuk Python SDK, Anda perlu menerapkan beberapa kelas dan di sana Anda memiliki dua opsi:

  • Gunakan API Python JavaExternalTransform untuk secara langsung mengakses Java Transforms, tetapi kelas Transformasi Java harus memiliki konstruktor publik atau metode statis publik untuk membangun transformasi dan metode pembangun publik untuk mengonfigurasi transformasi.

Contoh – https://github.com/apache/beam/blob/master/sdks/python/apache_beam/io/kafka.py

Dua kelas berikut patut dieksplorasi untuk melihat detail implementasi.

class ReadFromKafka(ExternalTransform):
 	"""
  	An external PTransform which reads from Kafka and returns a KV pair for
   	each item in the specified Kafka topics. If no Kafka Deserializer for
   	key/value is provided, then the data will be returned as a raw byte array.


class WriteToKafka(ExternalTransform):
 	"""
   	An external PTransform which writes KV data to a specified Kafka topic.
   	If no Kafka Serializer for key/value is provided, then key/value are
   	assumed to be byte arrays.

Atau, Anda dapat menerapkan dua antarmuka. Ini adalah ExternalTransformBuild dan ExternalTransformRegistrar.

ExternalTransformBuild membangun transformasi Java berdasarkan konfigurasi yang diteruskan ke pipa dan ExternalTransformRegistrar akan mendaftarkannya dengan layanan ekspansi.

Transformasi harus memiliki nama sumber daya seragam yang unik (urn), yang digunakan untuk mendaftarkannya dengan layanan ekspansi.

Contoh-https://github.com/apache/beam/blob/master/examples/multi-language/src/main/java/org/apache/beam/examples/multilianguage/javacountbuilder.java

Layanan Ekspansi Memainkan peran kunci, yang menciptakan dan menyuntikkan fragmen pipa spesifik bahasa yang sesuai ke dalam pipa. Perhatikan bahwa layanan ekspansi tergantung pada bahasa. Dalam kebanyakan kasus, layanan ekspansi default sudah cukup.

Anda perlu menggunakan skema balok untuk memetakan parameter konstruktor dan metode antara Python dan Java Code.

Jika kita mundur selangkah dan melihat apa yang sebenarnya terjadi di sini: kode yang ditulis dalam satu bahasa pemrograman digunakan bersama dengan kode dari bahasa pemrograman lain.

Mari kita melihat sekuens eksekusi pipa multi-bahasa.

Dalam hal ini, kami memiliki pipa di Python yang menggunakan serangkaian transformasi untuk dibaca dan menulis ke topik kafka.

  • Kafka IO ditulis di Java tetapi tersedia untuk digunakan dalam SDK Python.
  • Layanan ekspansi menyuntikkan objek serial untuk kafka io di dalam pipa.
  • Ketika seorang pelari mengeksekusi pekerjaan pipa, itu memanfaatkan harness SDK khusus bahasa untuk mengeksekusi kode spesifik bahasa.

Dan terakhir; Dari perspektif seorang insinyur data yang ingin menggunakan transformasi dalam platform multi-bahasa, ini relatif sederhana.

Faktanya, untuk menggunakan transformasi Java dalam pipa Python Anda, yang perlu Anda lakukan adalah memastikan bahwa Anda telah menginstal Java SDK di lingkungan pengembangan Anda dan kemudian Anda dapat menggunakan transformasi karena Anda akan menggunakan transformasi lain dari paket Python.

Dalam hal ini, transformasi ReadFromKafka dan WriteToKafka tersedia dalam modul kafka.io dan seperti yang Anda lihat dalam kode ini, ini mirip dengan menggunakan transformasi Python lainnya.

Kode contoh tersedia di github – https://github.com/apache/beam/blob/master/sdks/python/apache_beam/examples/kafkataxi/kafka_taxi.py

…
import apache_beam as beam
from apache_beam.io.kafka import ReadFromKafka
from apache_beam.io.kafka import WriteToKafka
from apache_beam.options.pipeline_options import GoogleCloudOptions
from apache_beam.options.pipeline_options import PipelineOptions
…
…
ride_col = (
       pipeline
       | ReadFromKafka(
           consumer_config={'bootstrap.servers': bootstrap_servers},
           topics=[topic],
           with_metadata=with_metadata)
…
…
       | WriteToKafka(
           producer_config={'bootstrap.servers': bootstrap_servers},
           topic=topic))

Melaksanakan pipa multi-bahasa tidak berbeda dengan pipa bahasa tunggal. Misalnya Anda dapat menjalankan pipa Kafka_taxi seperti yang ditunjukkan di bawah ini, yang sama dengan menjalankan pipa lain yang dikembangkan menggunakan Python SDK.

python3 -m venv env
source env/bin/activate
pip3 install 'apache-beam[gcp]'

export PROJECT="$(gcloud config get-value project)"
export TEMP_LOCATION="gs://demo_bucket_belgium/temp"
export REGION="europe-west1"
export JOB_NAME="kafka-taxi-`date +%Y%m%d-%H%M%S`"
export NUM_WORKERS="5"


python3 -m apache_beam.examples.kafkataxi.kafka_taxi \
 --runner DataflowRunner \
 --temp_location $TEMP_LOCATION \
 --project $PROJECT \
 --region $REGION \
 --num_workers $NUM_WORKERS \
 --job_name $JOB_NAME \
 --subnetwork https://www.googleapis.com/compute/v1/projects/$PROJECT_ID/regions/europe-west1/subnetworks/da-vpc-01 \
 --service_account_email=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \
 --bootstrap_servers $BOOTSTRAP_SERVER

Seperti disebutkan di atas untuk memanfaatkan kerangka kerja portabilitas dan menjalankan pipa multi-bahasa, pelari perlu menerapkan harness SDK. Saat ini DataFlow, Flink dan Spark Runners mendukungnya.

Bagian Implementasi Dataflow dari Runner_V2 untuk Python dan dijelaskan dalam posting blog ini.

Saya harap posting blog ini membantu Anda memahami konsep pipa multi-bahasa dari perspektif tiga persona yang berbeda. Juga tautan dokumentasi dan kode sampel harus membantu mempercepat pengembangan pipa multi-bahasa.



Leave a Reply

Your email address will not be published. Required fields are marked *