Pengantar Apache Beam

1. Ikhtisar

Dalam tutorial ini, kami akan memperkenalkan Apache Beam dan menjelajahi konsep dasarnya.

Kami akan mulai dengan mendemonstrasikan kasus penggunaan dan manfaat menggunakan Apache Beam, lalu kami akan membahas konsep dan terminologi dasar. Setelah itu, kita akan melihat contoh sederhana yang menggambarkan semua aspek penting Apache Beam.

2. Apa Itu Apache Beam?

Apache Beam (Batch + strEAM) adalah model pemrograman terpadu untuk pekerjaan pemrosesan data batch dan streaming. Ini menyediakan kit pengembangan perangkat lunak untuk menentukan dan membangun pipeline pemrosesan data serta runner untuk mengeksekusinya.

Apache Beam dirancang untuk menyediakan lapisan pemrograman portabel. Faktanya, Beam Pipeline Runners menerjemahkan pipeline pemrosesan data ke dalam API yang kompatibel dengan backend pilihan pengguna. Saat ini, backend pemrosesan terdistribusi ini didukung:

  • Apache Apex
  • Apache Flink
  • Apache Gearpump (inkubasi)
  • Apache Samza
  • Apache Spark
  • Google Cloud Dataflow
  • Hazelcast Jet

3. Mengapa Apache Beam?

Apache Beam menggabungkan pemrosesan data batch dan streaming, sementara yang lain sering melakukannya melalui API terpisah. Akibatnya, sangat mudah untuk mengubah proses streaming menjadi proses batch dan sebaliknya, katakanlah, saat persyaratan berubah.

Apache Beam meningkatkan portabilitas dan fleksibilitas. Kami fokus pada logika kami daripada detail yang mendasarinya. Selain itu, kami dapat mengubah backend pemrosesan data kapan saja.

Ada Java, Python, Go, dan Scala SDK yang tersedia untuk Apache Beam. Memang, semua orang di tim dapat menggunakannya dengan bahasa pilihan mereka.

4. Konsep Dasar

Dengan Apache Beam, kita dapat membuat grafik alur kerja (pipeline) dan menjalankannya. Konsep utama dalam model pemrograman adalah:

  • PCollection - mewakili kumpulan data yang dapat berupa batch tetap atau aliran data
  • PTransform - operasi pengolahan data yang mengambil satu atau lebih PCollection dan output nol atau lebih PCollection s
  • Pipeline - mewakili grafik asiklik terarah dari PCollection dan PTransform , dan karenanya, merangkum seluruh pekerjaan pemrosesan data
  • PipelineRunner - mengeksekusi Pipeline pada backend pemrosesan terdistribusi yang ditentukan

Sederhananya, PipelineRunner menjalankan Pipeline, dan Pipeline terdiri dari PCollection dan PTransform .

5. Contoh Jumlah Kata

Sekarang setelah kita mempelajari konsep dasar Apache Beam, mari merancang dan menguji tugas penghitungan kata.

5.1. Membangun Pipa Balok

Mendesain grafik alur kerja adalah langkah pertama dalam setiap pekerjaan Apache Beam. Mari tentukan langkah-langkah dari tugas hitung kata:

  1. Bacalah teks dari suatu sumber.
  2. Pisahkan teks menjadi daftar kata.
  3. Huruf kecil semua kata.
  4. Pangkas tanda baca.
  5. Filter stopwords.
  6. Hitung setiap kata unik.

Untuk mencapai hal ini, kita harus mengkonversi langkah di atas menjadi satu pipa menggunakan PCollection dan PTransform abstraksi.

5.2. Dependensi

Sebelum kita dapat mengimplementasikan grafik alur kerja kita, kita harus menambahkan ketergantungan inti Apache Beam ke proyek kita:

 org.apache.beam beam-sdks-java-core ${beam.version} 

Beam Pipeline Runners mengandalkan backend pemrosesan terdistribusi untuk melakukan tugas. Mari tambahkan DirectRunner sebagai dependensi runtime:

 org.apache.beam beam-runners-direct-java ${beam.version} runtime 

Tidak seperti Pipeline Runner lainnya, DirectRunner tidak memerlukan penyiapan tambahan apa pun, yang menjadikannya pilihan yang baik untuk pemula.

5.3. Penerapan

Apache Beam utilizes the Map-Reduce programming paradigm (same as Java Streams). In fact, it's a good idea to have a basic concept of reduce(), filter(), count(), map(), and flatMap() before we continue.

Creating a Pipeline is the first thing we do:

PipelineOptions options = PipelineOptionsFactory.create(); Pipeline p = Pipeline.create(options);

Now we apply our six-step word count task:

PCollection
    
      wordCount = p .apply("(1) Read all lines", TextIO.read().from(inputFilePath)) .apply("(2) Flatmap to a list of words", FlatMapElements.into(TypeDescriptors.strings()) .via(line -> Arrays.asList(line.split("\\s")))) .apply("(3) Lowercase all", MapElements.into(TypeDescriptors.strings()) .via(word -> word.toLowerCase())) .apply("(4) Trim punctuations", MapElements.into(TypeDescriptors.strings()) .via(word -> trim(word))) .apply("(5) Filter stopwords", Filter.by(word -> !isStopWord(word))) .apply("(6) Count words", Count.perElement());
    

The first (optional) argument of apply() is a String that is only for better readability of the code. Here is what each apply() does in the above code:

  1. First, we read an input text file line by line using TextIO.
  2. Splitting each line by whitespaces, we flat-map it to a list of words.
  3. Word count is case-insensitive, so we lowercase all words.
  4. Earlier, we split lines by whitespace, ending up with words like “word!” and “word?”, so we remove punctuations.
  5. Stopwords such as “is” and “by” are frequent in almost every English text, so we remove them.
  6. Finally, we count unique words using the built-in function Count.perElement().

As mentioned earlier, pipelines are processed on a distributed backend. It's not possible to iterate over a PCollection in-memory since it's distributed across multiple backends. Instead, we write the results to an external database or file.

First, we convert our PCollection to String. Then, we use TextIO to write the output:

wordCount.apply(MapElements.into(TypeDescriptors.strings()) .via(count -> count.getKey() + " --> " + count.getValue())) .apply(TextIO.write().to(outputFilePath));

Now that our Pipeline definition is complete, we can run and test it.

5.4. Running and Testing

So far, we've defined a Pipeline for the word count task. At this point, let's run the Pipeline:

p.run().waitUntilFinish();

On this line of code, Apache Beam will send our task to multiple DirectRunner instances. Consequently, several output files will be generated at the end. They'll contain things like:

... apache --> 3 beam --> 5 rocks --> 2 ...

Defining and running a distributed job in Apache Beam is as simple and expressive as this. For comparison, word count implementation is also available on Apache Spark, Apache Flink, and Hazelcast Jet.

6. Where Do We Go From Here?

Kami berhasil menghitung setiap kata dari file input kami, tetapi kami belum memiliki laporan dari kata-kata yang paling sering. Tentu saja, menyortir PCollection adalah masalah yang bagus untuk diselesaikan sebagai langkah selanjutnya.

Nanti, kita dapat mempelajari lebih lanjut tentang Windowing, Pemicu, Metrik, dan Transformasi yang lebih canggih. Dokumentasi Apache Beam memberikan informasi mendalam dan materi referensi.

7. Kesimpulan

Dalam tutorial ini, kita mempelajari apa itu Apache Beam dan mengapa itu lebih disukai daripada alternatif. Kami juga mendemonstrasikan konsep dasar Apache Beam dengan contoh jumlah kata.

Kode untuk tutorial ini tersedia di GitHub.