Berkenalan Dengan Apache Beam

Imre Nagi
Pujangga Teknologi
Published in
7 min readJan 24, 2019

Pada dasarnya pengolahan data bisa dilakukan dengan menggunakan mesin pengolah angka seperti Microsoft Excel, Numbers (Mac-OS). Atau jika pengguna membutuhkan visualisasi yang lebih fleksibel, pengguna juga bisa menggunakan bahasa pemograman seperti Python dengan tambahan beberapa library seperti Pandas, Numpy, dan lain-lain. Namun pada akhirnya penggunaan teknologi tersebut akan dibatasi oleh kemampuan mesin atau komputer yang digunakan untuk melakukan analisis. Jika pengguna menggunakan pinranti lunak tersebut untuk melakukan pemrosesan data yang jumlahnya sangat besar (dalam satuan GB atau TB), pemrosesan data mungkin akan diselesaikan dalam hitungan jam hingga hari. Jika kita sedang beruntung, aplikasi bisa tiba-tiba crash.

Permasalahan ini kemudian mendasari lahirnya teknologi big data yang kita kenal hari ini seperti Hadoop MapReduce, Apache Spark, Spark Streaming, Apache Storm, dan lain-lain. Masing-masing hadir dengan keunggulan dan kekurangan masing-masing. Sayangnya, Hadoop MapReduce kini mulai jarang digunakan karena Hadoop MapReduce relatif lebih lambat bila dibandingkan dengan Apache Spark yang menggunakan memori utama dari mesin pekerja (worker) dengan sebisa mungkin mengurangi operasi I/O ke disk mesin pekerja.

Beberapa Teknologi Big Data. Gambar disadur dari: http://mattturck.com

Selain itu, Hadoop MapReduce dan Apache Spark hanya dapat digunakan untuk melakukan Batch Processing. Sementara Apache Storm dan Spark Streaming pada umumnya digunakan untuk melakukan Stream Procsessing. Konsekuensinya adalah jika sebuah perusahaan ingin menerapkan Arsitektur Lambda yang notabene membutuhkan pemrosesan secara batch dan streaming, maka pengembang piranti lunak perlu mengurus dua teknologi berbeda, kombinasi dari MapReduce atau Apache Spark dengan Apache Storm atau Spark Streaming.

In Big Data, no one-size-fits-all, until Apache Beam comes...

Pengenalan

Apache Beam merupakan model pemograman yang digunakan untuk mendefinisikan dan mengeksekusi data processing pipeline termasuk ETL (Extract, Transform, dan Load) pada batch dan stream processing. Apache Beam sendiri merupakan implementasi dari sebuah paper tentang Dataflow model [1] yang dirancang di Google untuk menyelesaikan permasalahan komputasi pada sistem terdistribusi Google.

Dengan menggunakan SDK yang tersedia, kita kemudian dapat mendefiniskan Beam Pipeline dan kemudian melakukan eksekusi pada runner( processing backend )yang didukung oleh Apache Beam seperti Apache Apex, Apache Flink, Apache Samza, Apache Spark, and Google Cloud Dataflow.

Abstraksi

Untuk menggunakan Apache Beam, ada beberapa abstraksi dasar yang perlu dipahami.

Pipeline

Pipeline mengenkapsulasi seluruh data pemrosesan dari awal hingga akhir. Di dalam sebuah pipeline terdapat satu atau lebih proses yang membaca data masukan, satu atau lebih transformer yang akan melakukan transformasi atau komputasi pada data, dan satu atau lebih proses yang menulis data keluaran pada medium tertentu seperti berkas teks, blob, dan lain-lain. Setiap program Beam harus memiliki satu pipeline dan memiliki informasi tentang runner apa yang akan digunakan.

Ilustrasi Apache Beam Pipeline untuk aplikasi penghitung kata. Sumber: Dokumentasi Beam

Inisialisasi pipeline dapat dilakukan dengan cara berikut:

Inisialisasi Apache Beam pipeline.

PCollection

PCollection merepresentasikan kumpulan data terdistribusi yang akan diproses oleh Apache Beam. Jika Anda adalah pengembang aplikasi Spark, maka PCollection ekivalen dengan RDD yang digunakan di Spark.

Kumpulan data yang bisa diproses oleh Apache Beam dapat dikelompokan menjadi dua bagian: Bounded dataset dan Unbounded dataset. Bounded data set merupakan data yang berasal dari sumber yang tetap seperti file atau blob. Sementara unbounded data bisa bersumber dari data yang secara kontinu dikirimkan oleh sebuah sumber seperti data subscription dari message bus atau message broker seperti Kafka, Cloud Pub/Sub dan lain-lain.

Bounded PCollection dengan TextIO

Pada umumnya, sebuah Beam Pipeline menginisialisasi PCollection dengan membaca data dari sumber eksternal, seperti berkas teks, blob objek, Kafka, Cloud Pub/Sub dan lain-lain. Namun, pengembang pipeline juga bisa menggunakan data yang dimuat di memori program atau dengan menggunakan generator sekuens.

PCollection dengan in-memory data dan generator sekuens.

PTransform

PTransform merupakan abstraksi transformasi data pada Apache Beam. PTransform bisa memiliki satu atau lebih step yang digunakan untuk melakukan transformasi tertentu. Setiap PTransform menerima satu atau lebih masukan PCollection dari sebuah objek, melakukan pemrosesan yang telah didefinisikan dan menghasilkan keluaran dalam bentuk PCollection objek baru.

Pada contoh diatas, kita memiliki Greeting transform yang menerima masukanPCollection<String> dan akan menghasilkan keluaran PCollection<String> baru. Di dalam PTransform Greeting kita memiliki dua DoFn yaitu HelloDoFn dan HowAreYouDoFn yang masing-masingnya akan menambahkan string berbeda pada setiap step. Selain itu, Beam PTransform juga mendukung nested PTransform. yang berarti PTransform dapat menggunakan PTransform lain selama tipe data yang digunakan atau dihasilkan kompatibel dengan PCollection sebelum atau sesudahnya.

I/O Transforms

I/O Transform merupakan kumpulan PTransform yang digunakan untuk membaca atau menulis data ke berbagai macam media penyimpanan eksternal. Berikut beberapa I/O Transform yang sering digunakan:

  • TextIO: digunakan untuk membaca dan menulis data dari dan ke sebuah berkas teks yang disimpan pada file sistem di lokal ataupun di cloud seperti GCS, S3, dan lain-lain.
  • KafkaIO, PubsubIO: digunakan menerima dan mengirimkan data ke sebuah message broker seperti Kafka atau Cloud Pub/Sub.
Contoh penggunaan PubsubIO.
  • BigqueryIO, BigtableIO, JdbcIO: digunakan untuk membaca dan menulis data ke basis data seperti Bigquery, Cloud Bigtable atau SQL database.
  • Dan masih banyak IO Transform lainnya disini

Hal Menarik Dari Apache Beam

Arsitektur Lambda mengajarkan paradigma bahwa streaming analitik adalah adalah sistem yang sangat tidak akurat. Streaming analitik hanya mampu mengestimasi sebuah kejadian dalam rentang waktu tertentu. Oleh karena itu, pada arsitektur lambda, akurasi ini diperbaiki dengan adanya batch processing yang dijalankan secara periodik (setiap jam, harian, atau bahkan sekali sebulan).

Namun, yang menarik adalah real streaming pipeline pada Apache Beam sendiri memungkinkan kita untuk melakukan realtime analytics dengan akurasi yang menyerupai batch processing. Bagaimana? Pada Apache Beam terdapat dua fitur lanjutan berikut:

Windowing

Windowing membagi PCollection berdasarkan timestamp dari setiap elemennya. Transformasi yang mengagregasi beberapa elemenet seperti GroupByKey dan Combine , bekerja secara implisit pada setiap basis window. Selain itu, windowing juga bisa digunakan pada bounded maupun unbounded PCollection.

Contoh penggunaan Windowing pada Unbounded PCollection. Sumber: Dokumentasi Apache Beam

Ada beberapa jenis windowing yang dapat digunakan:

  • Fixed Window.
  • Sliding Window
  • Session Window
Ilustrasi Fixed Window. Sumber: Dokumentasi Apache Beam

Triggering

Apache Beam menggunakan trigger untuk menentukan kapan hasil dari sebuah aggregasi akan dikeluarkan untuk dikonsumsi oleh transformasi berikutnya. By default, apache beam trigger akan mengeluarkan hasil aggregasi pada saat beam mengestimasi bahwa semua data telah tiba untuk periode window tertentu. Namun, hal ini tentu dapat dikonfigurasi agar lebih fleksible dan sesuai dengan kebutuhan pengembang.

Ilustrasi event pada fixed window. Sumber: Dokumentasi apache beam
// Ilustrasi trigger pada Apache Beam (Accumulating Mode)
First trigger firing: [5, 8, 3]
Second trigger firing: [5, 8, 3, 15, 19, 23]
Third trigger firing: [5, 8, 3, 15, 19, 23, 9, 13, 10]

Managing Late Data

Sebuah event bisa jadi datang tepat waktu pada window yang sama atau bahkan bisa datang setelah window tersebut berakhir. Hal ini sangat wajar realtime processing. Untuk mengatasi ini, Apache Beam memiliki fitur untuk memperbolehkan data yang terlambat untuk masuk dalam analisis dengan menggunakan API.withAllowedLateness pada strategi windowing yang digunakan.

Pada contoh kode berikut, beam menggunakan strategi fixed window dengan interval 1 menit dan memberikan tolerasi terhadap data yang terlambat hingga dua hari kedepan.

Jika ditemukan adanya data yang terlambat, maka pada akhir window tersebut seluruh data (termasuk late data) akan diagregasi kembali sehingga kita bisa mendapatkan hasil yang lebih akurat untuk window tersebut.

Pola Umum Penggunaan Apache Beam

Pipeline linear

Mode linear merupakan mode paling sederhana dari sebuah beam pipeline dimana masukan PCollection ditransformasikan oleh satu atau lebih PTransform secara berurutan.

Satu transform dengan multi keluaran

Pada pola satu transform dengan multi keluaran, sebuah PTransform bisa menghasilkan keluaran beberapa PCollection berbeda. Pola penggunaan ini misalnya dapat digunakan ketika pengembang aplikasi memiliki keluaran sampingan seperti error atau ketika PTransform mengklasifikasikan masukan ke beberapa PCollection keluaran yang berbeda.

Pada contoh ini, keluaran transformasi yang dihasilkan adalah sebuah PCollectionTuple yang menyimpan seluruh PCollection yang dihasilkan oleh PTransform.

Multi transform untuk sebuah PCollection

Keluaran tambahan untuk memisahkan data dengan kriteria tertentu. Sumber: Dokumentasi Beam

Pola penggunaan ini pada dasarnya dapat menghasilkan keluaran yang sama dengan pola penggunaan sebelumnya (satu transform dengan multi keluaran). Namun, pada pola ini alih-alih digunakan satu PTransform, digunakan dua PTransform yang berbeda pada satu PCollection yang sama.

Menggabungkan beberapa PCollection

Pada pola ini, pengguna dapat menggabungkan dua atau lebih PCollection dengan tipe data yang sama menjadi sebuah PCollection.

Join Beberapa Sumber Data

Pola penggunaan ini menyerupai operasi Join yang dimiliki oleh SQL. Pada ilustrasi dibawah, sumber data 1 (basis data) menghasilkan keluaran PCollection dari pasangan key-value nama dan alamat. Sementara sumber data 2 (berkas teks) menghasilkan keluaran PCollection dari pasangan key-value nama dan pesanan barang tertentu. Operasi transformasiJoin pada Apache Beam akan menghasilkan PCollection dari pasangan key-value nama, alamat dan nama pesanan.

Minimal WordCount

Kesimpulan

  • Apache beam dapat digunakan untuk batch dan stream processing.
  • Dengan menggunakan fitur Windowing dan Triggering, apache beam dapat melakukan realtime analitik dengan hasil yang lebih akurat.

Referensi

[1] http://www.vldb.org/pvldb/vol8/p1792-Akidau.pdf

[2] Streaming 101 https://www.oreilly.com/ideas/the-world-beyond-batch-streaming-101

[3] Streaming 102 https://www.oreilly.com/ideas/the-world-beyond-batch-streaming-102

P.S. Jika teman-teman menyukai artikel semacam ini, silakan subscribe ke newsletter kita dan dapatkan notifikasi artikel terbaru langsung di inbox kamu!

--

--

Imre Nagi
Pujangga Teknologi

Google Developer Expert, Cloud Platform Engineer @gojek