Úvod do Apache Beam

1. Prehľad

V tomto tutoriáli si predstavíme Apache Beam a preskúmame jeho základné koncepty.

Začneme ukážkou prípadu použitia a výhod používania Apache Beam a potom sa budeme venovať základným konceptom a terminológiám. Potom si ukážeme jednoduchý príklad, ktorý ilustruje všetky dôležité aspekty Apache Beam.

2. Čo je Apache Beam?

Apache Beam (Batch + strEAM) je jednotný programovací model pre dávkové a streamovacie spracovanie dát. Poskytuje súpravu na vývoj softvéru na definovanie a konštrukciu potrubí na spracovanie údajov, ako aj bežcov na ich vykonávanie.

Apache Beam je navrhnutý tak, aby poskytoval prenosnú programovú vrstvu. Beam Pipeline Runners v skutočnosti prekladajú kanál spracovania údajov do API kompatibilného s koncovým serverom podľa výberu používateľa. V súčasnosti sú podporované tieto distribuované backendy spracovania:

  • Apache Apex
  • Apache Flink
  • Apache Gearpump (inkubácia)
  • Apache Samza
  • Apache Spark
  • Tok dát Google Cloud
  • Hazelcast Jet

3. Prečo Apache Beam?

Apache Beam spája dávkové a streamované spracovanie údajov, zatiaľ čo iné to často robia prostredníctvom samostatných rozhraní API. V dôsledku toho je veľmi ľahké zmeniť proces streamovania na dávkový a naopak, povedzme, ako sa menia požiadavky.

Apache Beam zvyšuje prenosnosť a flexibilitu. Zameriavame sa skôr na našu logiku ako na základné podrobnosti. Okrem toho môžeme kedykoľvek zmeniť back-end spracovania údajov.

Pre server Apache Beam sú k dispozícii sady Java, Python, Go a Scala SDK. Každý v tíme to môže skutočne použiť podľa svojho výberu jazyka.

4. Základné koncepty

Pomocou Apache Beam môžeme zostrojiť grafy pracovných tokov (kanály) a vykonávať ich. Kľúčové koncepty programovacieho modelu sú:

  • PCzber - predstavuje množinu údajov, ktorá môže byť pevnou dávkou alebo prúdom údajov
  • PTransformácia - operácia spracovania údajov, ktorá trvá jeden alebo viac PCzbers a výstupy nula alebo viac PCzbers
  • Potrubie - predstavuje smerovaný acyklický graf PCzber a PTransformácia, a teda zapuzdruje celú úlohu spracovania údajov
  • PipelineRunner - vykoná a Potrubie na zadanom distribuovanom backendu spracovania

Jednoducho povedané, a PipelineRunner vykonáva a Potrubie, a a Potrubie pozostáva z PCzber a PTransformácia.

5. Príklad počtu slov

Teraz, keď sme sa naučili základné koncepty Apache Beam, poďme navrhnúť a otestovať úlohu počítania slov.

5.1. Konštrukcia trámového potrubia

Návrh grafu pracovného toku je prvým krokom v každej úlohe Apache Beam. Definujme kroky úlohy týkajúcej sa počtu slov:

  1. Prečítajte si text zo zdroja.
  2. Rozdelte text na zoznam slov.
  3. Malé slová.
  4. Orezať interpunkciu.
  5. Filtrovať kľúčové slová.
  6. Spočítajte každé jedinečné slovo.

Aby sme to dosiahli, budeme musieť vyššie uvedené kroky previesť do jedného Potrubie použitím PCzber a PTransformácia abstrakcie.

5.2. Závislosti

Predtým, ako budeme môcť implementovať náš graf pracovného toku, mali by sme do nášho projektu pridať základnú závislosť Apache Beam:

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

Beam Pipeline Runners sa pri vykonávaní úloh spoliehajú na distribuovaný backend procesora. Pridajme DirectRunner ako závislosť runtime:

 org.apache.beam lúč-bežci-direct-java runtime $ {beam.version} 

Na rozdiel od ostatných bežcov potrubia DirectRunner nepotrebuje žiadne ďalšie nastavenie, čo z neho robí dobrú voľbu pre začiatočníkov.

5.3. Implementácia

Apache Beam využíva programovú paradigmu Map-Reduce (rovnaká ako v prípade Java Streams). V skutočnosti je dobrý nápad mať základný koncept znížiť (), filter (), count (), mapa ()a flatMap () než budeme pokračovať.

Vytvorenie a Potrubie je prvá vec, ktorú robíme:

Možnosti PipelineOptions = PipelineOptionsFactory.create (); Pipeline p = Pipeline.create (možnosti);

Teraz použijeme našu šesťstupňovú úlohu spočítania slov:

PCzber wordCount = p .apply ("(1) Čítať všetky riadky", TextIO.read (). from (inputFilePath)) .apply ("(2) Flatmap na zoznam slov", FlatMapElements.into (TypeDescriptors.strings () ) .via (riadok -> Arrays.asList (line.split ("\ s")))) .apply ("(3) Malé všetky", MapElements.into (TypeDescriptors.strings ()) .via (slovo - > word.toLowerCase ())) .apply ("(4) Orezať interpunkciu", MapElements.into (TypeDescriptors.strings ()) .via (word -> orezať (word))) .apply ("(5) Filtrovať stopwords ", Filter.by (word ->! IsStopWord (word))) .apply (" (6) Počet slov ", Count.perElement ());

Prvý (voliteľný) argument použiť () je a String to je len pre lepšiu čitateľnosť kódu. Tu je to, čo každý z nich použiť () robí vo vyššie uvedenom kóde:

  1. Najskôr pomocou príkazov prečítame riadok po riadku vstupný textový súbor TextIO.
  2. Ak každý riadok rozdelíte na medzery, naplocho ho namapujeme na zoznam slov.
  3. V počte slov sa nerozlišujú malé a veľké písmená, takže všetky slová píšeme malými písmenami.
  4. Predtým sme rozdelili riadky na medzery a skončili sme slovami ako „slovo!“ a „slovo?“, takže odstránime interpunkciu.
  5. Stopové slová ako „je“ a „od“ sú časté takmer v každom anglickom texte, preto ich odstránime.
  6. Na záver spočítame jedinečné slová pomocou zabudovanej funkcie Count.perElement ().

Ako už bolo spomenuté, potrubia sa spracúvajú na distribuovanom backende. Nie je možné iterovať cez a PCzber v pamäti, pretože je distribuovaný na viacerých backendoch. Namiesto toho výsledky zapíšeme do externej databázy alebo súboru.

Najskôr konvertujeme naše PCzber do String. Potom použijeme TextIO napísať výstup:

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

Teraz, keď naše Potrubie definícia je úplná, môžeme ju spustiť a otestovať.

5.4. Beh a testovanie

Zatiaľ sme definovali a Potrubie pre úlohu počítania slov. V tomto okamihu spustíme Potrubie:

p.run (). waitUntilFinish ();

Na tomto riadku kódu Apache Beam odošle našu úlohu na viac DirectRunner inštancie. Následne sa na konci vygeneruje niekoľko výstupných súborov. Budú obsahovať veci ako:

... apache -> 3 lúče -> 5 kameňov -> 2 ...

Definovanie a spustenie distribuovanej úlohy v Apache Beam je rovnako jednoduché a expresívne. Pre porovnanie, implementácia počtu slov je k dispozícii aj na serveroch Apache Spark, Apache Flink a Hazelcast Jet.

6. Kam pôjdeme odtiaľto?

Úspešne sme spočítali každé slovo z nášho vstupného súboru, ale zatiaľ nemáme správu o najčastejších slovách. Určite, triedenie a PCzber je dobrý problém, ktorý je potrebné vyriešiť ako náš ďalší krok.

Neskôr sa môžeme dozvedieť viac o vytváraní okien, spúšťačoch, metrikách a sofistikovanejších transformáciách. Dokumentácia Apache Beam poskytuje podrobné informácie a referenčný materiál.

7. Záver

V tomto tutoriáli sme sa dozvedeli, čo je Apache Beam a prečo je uprednostňovaný pred alternatívami. Na príklade počtu slov sme tiež demonštrovali základné koncepty Apache Beam.

Kód tohto tutoriálu je k dispozícii na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found