Pengenalan Apache Beam

1. Gambaran keseluruhan

Dalam tutorial ini, kami akan memperkenalkan Apache Beam dan meneroka konsep asasnya.

Kita akan mulakan dengan menunjukkan kes penggunaan dan faedah menggunakan Apache Beam, dan kemudian kita akan merangkumi konsep dan terminologi asas. Selepas itu, kita akan melalui contoh ringkas yang menggambarkan semua aspek penting Apache Beam.

2. Apa itu Apache Beam?

Apache Beam (Batch + strEAM) adalah model pengaturcaraan terpadu untuk pekerjaan pemprosesan data kumpulan dan streaming. Ini menyediakan kit pengembangan perisian untuk menentukan dan membina saluran paip pemprosesan data serta pelari untuk melaksanakannya.

Apache Beam direka untuk menyediakan lapisan pengaturcaraan mudah alih. Malah, Beam Pipeline Runners menerjemahkan saluran pemprosesan data ke dalam API yang sesuai dengan backend pilihan pengguna. Pada masa ini, backend pemprosesan yang diedarkan ini disokong:

  • Apache Apex
  • Apache Flink
  • Apache Gearpump (inkubasi)
  • Apache Samza
  • Apache Spark
  • Aliran Data Awan Google
  • Jet Hazelcast

3. Mengapa Apache Beam?

Apache Beam menggabungkan pemprosesan data kumpulan dan streaming, sementara yang lain sering melakukannya melalui API berasingan. Akibatnya, sangat mudah untuk mengubah proses streaming ke proses kumpulan dan sebaliknya, misalnya, apabila keperluan berubah.

Apache Beam meningkatkan daya tahan dan kelenturan. Kami memusatkan perhatian pada logik kami dan bukannya perincian yang mendasari. Lebih-lebih lagi, kita dapat mengubah backend pemprosesan data pada bila-bila masa.

Terdapat Java, Python, Go, dan Scala SDK yang tersedia untuk Apache Beam. Memang, semua orang dalam pasukan boleh menggunakannya dengan bahasa pilihan mereka.

4. Konsep Asas

Dengan Apache Beam, kita dapat membina grafik aliran kerja (saluran paip) dan melaksanakannya. Konsep utama dalam model pengaturcaraan adalah:

  • PCollection - mewakili kumpulan data yang dapat menjadi kumpulan tetap atau aliran data
  • PTransform - operasi pemprosesan data yang mengambil satu atau lebih PCollection s dan mengeluarkan sifar atau lebih PCollection s
  • Paip - mewakili grafik asiklik PCollection dan PTransform yang diarahkan , dan oleh itu, merangkumi keseluruhan pekerjaan pemprosesan data
  • PipelineRunner - melaksanakan Pipeline pada backend pemprosesan diedarkan yang ditentukan

Ringkasnya, PipelineRunner melaksanakan Pipeline, dan Pipeline terdiri dari PCollection dan PTransform .

5. Contoh Kata Bilangan

Setelah kita mengetahui konsep asas Apache Beam, mari merancang dan menguji tugas penghitungan perkataan.

5.1. Membina Paip Rasuk

Merancang grafik aliran kerja adalah langkah pertama dalam setiap pekerjaan Apache Beam. Mari tentukan langkah-langkah tugas penghitungan kata:

  1. Baca teks dari sumber.
  2. Bahagikan teks ke dalam senarai perkataan.
  3. Huruf kecil semua perkataan.
  4. Potong tanda baca.
  5. Tapis kata kunci.
  6. Hitung setiap perkataan yang unik.

Untuk mencapainya, kita perlu menukar langkah-langkah di atas menjadi Paip tunggal menggunakan abstraksi PCollection dan PTransform .

5.2. Kebergantungan

Sebelum kita dapat melaksanakan grafik aliran kerja kita, kita harus menambahkan kebergantungan teras Apache Beam ke projek kita:

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

Beam Pipeline Runners bergantung pada backend pemprosesan yang diedarkan untuk melaksanakan tugas. Mari tambahkan DirectRunner sebagai kebergantungan runtime:

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

Tidak seperti Pipeline Runners yang lain, DirectRunner tidak memerlukan persediaan tambahan, yang menjadikannya pilihan yang baik untuk pemula.

5.3. Pelaksanaan

Apache Beam menggunakan paradigma pengaturcaraan Map-Reduce (sama seperti Java Streams). Sebenarnya, adalah idea yang baik untuk mempunyai konsep asas mengurangkan () , menyaring () , mengira () , peta () , dan peta datar () sebelum kita meneruskan.

Membuat Paip adalah perkara pertama yang kita lakukan:

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

Sekarang kami melaksanakan tugas pengiraan kata enam langkah:

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());
    

Argumen pertama (pilihan) berlaku () adalah String yang hanya untuk pembacaan kod yang lebih baik. Inilah yang masing-masing berlaku () dalam kod di atas:

  1. Pertama, kita membaca fail teks input baris demi baris menggunakan TextIO .
  2. Memisahkan setiap baris dengan ruang kosong, kami memetakannya rata ke senarai perkataan.
  3. Jumlah perkataan tidak peka huruf besar kecil, jadi kami mengecilkan semua kata.
  4. Sebelumnya, kami membelah baris dengan ruang kosong, diakhiri dengan kata-kata seperti "word!" dan "kata?", jadi kami membuang tanda baca.
  5. Kata kunci seperti "is" dan "by" sering terdapat di hampir setiap teks bahasa Inggeris, jadi kami menghapusnya.
  6. Akhirnya, kami mengira perkataan unik menggunakan fungsi Count.perElement () terbina dalam .

Seperti disebutkan sebelumnya, saluran pipa diproses berdasarkan backend yang diedarkan. Tidak mungkin melakukan iterasi melalui memori PCollection kerana diedarkan di pelbagai backend. Sebaliknya, kami menulis hasilnya ke pangkalan data atau fail luaran.

Pertama, kita menukar PCollection ke String . Kemudian, kami menggunakan TextIO untuk menulis 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 berjaya menghitung setiap perkataan dari fail input kami, tetapi kami belum mempunyai laporan mengenai perkataan yang paling kerap. Sudah tentu, menyusun PCollection adalah masalah yang baik untuk diselesaikan sebagai langkah seterusnya.

Kemudian, kita dapat mengetahui lebih lanjut mengenai Window, Pencetus, Metrik dan Transformasi yang lebih canggih. Dokumentasi Apache Beam memberikan maklumat dan bahan rujukan yang mendalam.

7. Kesimpulannya

Dalam tutorial ini, kami mempelajari apa itu Apache Beam dan mengapa ia lebih disukai daripada alternatif. Kami juga menunjukkan konsep asas Apache Beam dengan contoh jumlah perkataan.

Kod untuk tutorial ini boleh didapati di GitHub.