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:

  1. Pročitajte tekst iz izvora.
  2. Podijelite tekst na popis riječi.
  3. Malim slovima sve riječi.
  4. Izrežite interpunkcije.
  5. Filtrirajte zaustavne riječi.
  6. 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:

  1. Prvo čitamo ulaznu tekstualnu datoteku redak po redak pomoću TekstIO.
  2. Podijelivši svaki redak razmacima, ravnamo ga na popis riječi.
  3. Broj riječi ne razlikuje velika i mala slova, pa ćemo malim slovima napisati mala slova.
  4. Ranije smo crte razdvajali razmacima, završavajući riječima poput "riječ!" i "riječ?", pa uklanjamo interpunkcije.
  5. Lozinke poput "je" i "by" česte su u gotovo svakom engleskom tekstu, pa ih uklanjamo.
  6. 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.


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