Uvod u Apache Beam
1. Pregled
U ovom uputstvu predstavit ćemo Apache Beam i istražiti njegove temeljne koncepte.
Počet ćemo s demonstracijom slučaja upotrebe i prednosti upotrebe Apache Beama, a zatim ćemo pokriti temeljne koncepte i terminologije. Poslije ćemo proći kroz jednostavan primjer koji ilustrira sve važne aspekte Apache Beama.
2. Što je Apache Beam?
Apache Beam (Batch + strEAM) jedinstveni je programski model za poslove skupne i strujeće obrade podataka. Pruža komplet za razvoj softvera za definiranje i izgradnju cjevovoda za obradu podataka, kao i pokretače za njihovo izvršavanje.
Apache Beam dizajniran je za pružanje prijenosnog programskog sloja. Zapravo, Beam Pipeline Runners prevode cjevovod za obradu podataka u API kompatibilan sa pozadinom po izboru korisnika. Trenutno su podržane ove distribuirane pozadinske obrade:
- Apache Apex
- Apache Flink
- Apache zupčasta pumpa (inkubiranje)
- Apač Samza
- Apache iskra
- Google Cloud Dataflow
- Mlaznica lješnjaka
3. Zašto Apache Beam?
Apache Beam spaja skupnu i strujnu obradu podataka, dok drugi to često čine putem zasebnih API-ja. Slijedom toga, vrlo je jednostavno promijeniti tok streaminga u batch postupak i obrnuto, recimo, kako se zahtjevi mijenjaju.
Apache Beam podiže prenosivost i fleksibilnost. Usredotočeni smo na svoju logiku, a ne na temeljne detalje. Štoviše, u bilo kojem trenutku možemo promijeniti pozadinu za obradu podataka.
Za Apache Beam dostupni su Java, Python, Go i Scala SDK. Doista, svi u timu mogu ga koristiti sa svojim jezikom po svom izboru.
4. Temeljni pojmovi
S Apache Beamom možemo konstruirati grafikone tijeka rada (cjevovode) i izvršavati ih. Ključni pojmovi u programskom modelu su:
- PZbirka - predstavlja skup podataka koji može biti fiksna skupina ili tok podataka
- PTransform - operacija obrade podataka koja traje jedan ili više PZbirkas i izlazi nula ili više PZbirkas
- Cjevovod - predstavlja usmjereni aciklički graf od PZbirka i PTransform, i stoga obuhvaća cjelokupni posao obrade podataka
- Pokretač cjevovoda - izvršava a Cjevovod na određenom distribuiranom pozadinskom okruženju
Jednostavno rečeno, a Pokretač cjevovoda izvršava a Cjevovod, i a Cjevovod sastoji se od PZbirka i PTransform.
5. Primjer brojanja riječi
Sad kad smo naučili osnovne koncepte Apache Beama, osmislimo i testiraj zadatak brojanja riječi.
5.1. Izgradnja cjevovoda greda
Dizajniranje grafa tijeka rada prvi je korak u svakom poslu Apache Beam. Definirajmo korake zadatka brojanja riječi:
- Pročitajte tekst iz izvora.
- Podijelite tekst na popis riječi.
- Malim slovima sve riječi.
- Izrežite interpunkcije.
- Filtrirajte zaustavne riječi.
- Prebrojite svaku jedinstvenu riječ.
Da bismo to postigli, morat ćemo gornje korake pretvoriti u jedan Cjevovod koristeći PZbirka i PTransform apstrakcije.
5.2. Ovisnosti
Prije nego što implementiramo naš grafikon tijeka rada, trebali bismo dodati temeljnu ovisnost Apache Beama u naš projekt:
org.apache.beam snop-sdks-java-jezgra $ {snop.verzija}
Izvodnici vodova za zrake oslanjaju se na distribuiranu pozadinsku obradu za izvršavanje zadataka. Dodajmo DirectRunner kao runtime ovisnost:
org.apache.beam snop-runners-direct-java $ {beam.version} vrijeme izvođenja
Za razliku od ostalih cjevovoda, DirectRunner ne treba nikakva dodatna podešavanja, što ga čini dobrim izborom za početak.
5.3. Provedba
Apache Beam koristi programsku paradigmu Map-Reduce (isto kao Java Streams). Zapravo je dobra ideja imati osnovni koncept smanjiti(), filtar(), računati(), karta(), i flatMap () prije nego što nastavimo.
Stvaranje a Cjevovod je prva stvar koju radimo:
PipelineOptions options = PipelineOptionsFactory.create (); Cjevovod p = Cjevovod.create (opcije);
Sada primjenjujemo naš zadatak brojanja riječi u šest koraka:
PZbirka wordCount = p .apply ("(1) Pročitaj sve retke", TextIO.read (). from (inputFilePath)) .apply ("(2) Flatmap na popis riječi", FlatMapElements.into (TypeDescriptors.strings () ) .via (linija -> Arrays.asList (line.split ("\ s")))) .apply ("(3) Sve s malim slovom", MapElements.into (TypeDescriptors.strings ()) .via (word - > word.toLowerCase ())) .apply ("(4) Izrezi interpunkcije", MapElements.into (TypeDescriptors.strings ()) .via (word -> trim (word))) .apply ("(5) Filtriranje zaustavnih riječi ", Filter.by (riječ ->! IsStopWord (riječ)))) .apply (" (6) Brojanje riječi ", Count.perElement ());
Prvi (neobavezni) argument primijeniti () je Niz to je samo za bolju čitljivost koda. Evo što svaki primijeniti () radi u gornjem kodu:
- Prvo čitamo ulaznu tekstualnu datoteku redak po redak pomoću TekstIO.
- Podijelivši svaki redak razmacima, ravnamo ga na popis riječi.
- Broj riječi ne razlikuje velika i mala slova, pa ćemo malim slovima napisati mala slova.
- Ranije smo crte razdvajali razmacima, završavajući riječima poput "riječ!" i "riječ?", pa uklanjamo interpunkcije.
- Lozinke poput "je" i "by" česte su u gotovo svakom engleskom tekstu, pa ih uklanjamo.
- Konačno, računamo jedinstvene riječi pomoću ugrađene funkcije Count.perElement ().
Kao što je ranije spomenuto, cjevovodi se obrađuju na distribuiranom pozadinskom okruženju. Nije moguće ponoviti preko a PZbirka u memoriji jer se distribuira u više pozadinskih mreža. Umjesto toga, rezultate zapisujemo u vanjsku bazu podataka ili datoteku.
Prvo pretvaramo naše PZbirka do Niz. Zatim, koristimo TekstIO za pisanje rezultata:
wordCount.apply (MapElements.into (TypeDescriptors.strings ()) .via (count -> count.getKey () + "->" + count.getValue ())) .apply (TextIO.write (). to ( outputFilePath));
Sad to naše Cjevovod definicija je dovršena, možemo je pokrenuti i testirati.
5.4. Trčanje i testiranje
Do sada smo definirali a Cjevovod za zadatak brojanja riječi. U ovom trenutku, pokrenimo Cjevovod:
p.run (). waitUntilFinish ();
Na ovom retku koda, Apache Beam će poslati naš zadatak na višestruke DirectRunner instance. Slijedom toga, na kraju će se generirati nekoliko izlaznih datoteka. Sadržat će sljedeće stvari:
... apache -> 3 grede -> 5 stijena -> 2 ...
Definiranje i izvođenje distribuiranog posla u Apache Beamu jednako je jednostavno i izražajno. Za usporedbu, implementacija broja riječi dostupna je i na Apache Spark, Apache Flink i Hazelcast Jet.
6. Kamo idemo odavde?
Uspješno smo prebrojali svaku riječ iz naše ulazne datoteke, ali još nemamo izvješće o najčešćim riječima. Svakako, sortiranje a PZbirka je dobar problem za rješavanje kao sljedeći korak.
Kasnije možemo saznati više o prozorima, okidačima, mjernim podacima i sofisticiranijim transformacijama. Apache Beam Dokumentacija pruža detaljne informacije i referentni materijal.
7. Zaključak
U ovom smo tutorijalu naučili što je Apache Beam i zašto se daje prednost nad alternativama. Također smo demonstrirali osnovne koncepte Apache Beama primjerom brojanja riječi.
Kôd ovog vodiča dostupan je na GitHub-u.