Ú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:
- Prečítajte si text zo zdroja.
- Rozdelte text na zoznam slov.
- Malé slová.
- Orezať interpunkciu.
- Filtrovať kľúčové slová.
- 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:
- Najskôr pomocou príkazov prečítame riadok po riadku vstupný textový súbor TextIO.
- Ak každý riadok rozdelíte na medzery, naplocho ho namapujeme na zoznam slov.
- V počte slov sa nerozlišujú malé a veľké písmená, takže všetky slová píšeme malými písmenami.
- Predtým sme rozdelili riadky na medzery a skončili sme slovami ako „slovo!“ a „slovo?“, takže odstránime interpunkciu.
- Stopové slová ako „je“ a „od“ sú časté takmer v každom anglickom texte, preto ich odstránime.
- 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.