Introduksjon til Apache Beam

1. Oversikt

I denne opplæringen vil vi introdusere Apache Beam og utforske de grunnleggende konseptene.

Vi begynner med å demonstrere brukssaken og fordelene ved å bruke Apache Beam, og deretter dekke grunnleggende konsepter og terminologier. Etterpå går vi gjennom et enkelt eksempel som illustrerer alle de viktige aspektene ved Apache Beam.

2. Hva er Apache Beam?

Apache Beam (Batch + strEAM) er en enhetlig programmeringsmodell for batch- og streaming-databehandlingsjobber. Det gir et programvareutviklingssett for å definere og konstruere rørledninger for databehandling samt løpere for å utføre dem.

Apache Beam er designet for å gi et bærbart programmeringslag. Faktisk oversetter Beam Pipeline Runners databehandlingsrørledningen til API-en som er kompatibel med brukerens valg av brukeren. Foreløpig støttes disse distribuerte behandlingsbackendene:

  • Apache Apex
  • Apache Flink
  • Apache Gearpump (inkubering)
  • Apache Samza
  • Apache Spark
  • Google Cloud Dataflow
  • Hazelcast Jet

3. Hvorfor Apache Beam?

Apache Beam smelter databehandling og streaming av data, mens andre ofte gjør det via separate APIer. Derfor er det veldig enkelt å endre en streamingprosess til en batchprosess og omvendt, for eksempel når kravene endres.

Apache Beam øker bærbarhet og fleksibilitet. Vi fokuserer på vår logikk i stedet for de underliggende detaljene. Videre kan vi når som helst endre databehandlingsbakgrunnen.

Det er Java, Python, Go og Scala SDK-er tilgjengelig for Apache Beam. Faktisk kan alle på laget bruke det med sitt valgte språk.

4. Grunnleggende konsepter

Med Apache Beam kan vi konstruere arbeidsflytgrafer (rørledninger) og utføre dem. Nøkkelbegrepene i programmeringsmodellen er:

  • PC-samling - representerer et datasett som kan være en fast batch eller en datastrøm
  • PTransform - en databehandlingsoperasjon som tar en eller flere PC-samlings og gir ut null eller mer PC-samlings
  • Rørledning - representerer en rettet asyklisk graf av PC-samling og PTransform, og dermed innkapsler hele databehandlingsjobben
  • PipelineRunner - utfører a Rørledning på en spesifisert distribuert behandlingsbackend

Enkelt sagt, a PipelineRunner utfører a Rørledning, og en Rørledning inneholder PC-samling og PTransform.

5. Ordtelling Eksempel

Nå som vi har lært de grunnleggende konseptene i Apache Beam, la oss designe og teste en ordtellingoppgave.

5.1. Konstruere en bjelkeledning

Å designe arbeidsflytgrafen er det første trinnet i hver Apache Beam-jobb. La oss definere trinnene for en ordtellingoppgave:

  1. Les teksten fra en kilde.
  2. Del teksten i en ordliste.
  3. Små ord.
  4. Trim tegnsetting.
  5. Filtrer stoppord.
  6. Tell hvert unike ord.

For å oppnå dette må vi konvertere trinnene ovenfor til en enkelt Rørledning ved hjelp av PC-samling og PTransform abstraksjoner.

5.2. Avhengigheter

Før vi kan implementere arbeidsflytgrafen vår, bør vi legge til Apache Beams kjerneavhengighet i prosjektet vårt:

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

Beam Pipeline Runners er avhengige av en distribuert behandlingsbackend for å utføre oppgaver. La oss legge til DirectRunner som en kjøretidsavhengighet:

 org.apache.beam beam-runners-direct-java $ {beam.version} kjøretid 

I motsetning til andre rørledningsløpere, DirectRunner trenger ikke noe ekstra oppsett, noe som gjør det til et godt valg for startere.

5.3. Gjennomføring

Apache Beam bruker Map-Reduce programmeringsparadigmet (samme som Java Streams). Det er faktisk en god idé å ha et grunnleggende konsept av redusere(), filter(), telle(), kart(), og flatMap () før vi fortsetter.

Opprette en Rørledning er det første vi gjør:

Alternativer for PipelineOptions = PipelineOptionsFactory.create (); Pipeline p = Pipeline.create (opsjoner);

Nå bruker vi vår seks-trinns ordtellingoppgave:

PC-samling wordCount = p .apply ("(1) Les alle linjene", TextIO.read (). fra (inputFilePath)) .apply ("(2) Flatmap til en liste over ord", FlatMapElements.into (TypeDescriptors.strings () ) .via (line -> Arrays.asList (line.split ("\ s")))) .apply ("(3) Smallcase all", MapElements.into (TypeDescriptors.strings ()) .via (word - > word.toLowerCase ())) .apply ("(4) Trim tegnsetting", MapElements.into (TypeDescriptors.strings ()) .via (word -> trim (word))) .apply ("(5) Filter stopword ", Filter.by (word ->! IsStopWord (word))) .apply (" (6) Count words ", Count.perElement ());

Det første (valgfrie) argumentet til søke om() er en String det er bare for bedre lesbarhet av koden. Her er hva hver søke om() gjør i koden ovenfor:

  1. Først leser vi en inngangstekstfil fil for linje ved hjelp av TextIO.
  2. Ved å dele hver linje med mellomrom, kartlegger vi den til en ordliste.
  3. Antall ord er ikke store og små bokstaver, så vi små bokstaver.
  4. Tidligere delte vi linjer etter mellomrom, og endte med ord som “ord!” og “ord?”, så vi fjerner tegnsetting.
  5. Stoppord som “er” og “ved” er hyppige i nesten alle engelske tekster, så vi fjerner dem.
  6. Til slutt teller vi unike ord ved hjelp av den innebygde funksjonen Count.perElement ().

Som nevnt tidligere behandles rørledninger på en distribuert backend. Det er ikke mulig å gjenta over en PC-samling i minnet siden den er fordelt på flere backender. I stedet skriver vi resultatene til en ekstern database eller fil.

Først konverterer vi vår PC-samling til String. Så bruker vi TextIO for å skrive utgangen:

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

Nå som vår Rørledning definisjonen er komplett, kan vi kjøre og teste den.

5.4. Løping og testing

Så langt har vi definert en Rørledning for ordtellingoppgaven. La oss på dette punktet kjøre Rørledning:

p.run (). waitUntilFinish ();

På denne kodelinjen vil Apache Beam sende oppgaven vår til flere DirectRunner tilfeller. Følgelig vil flere utdatafiler bli generert på slutten. De inneholder ting som:

... apache -> 3 bjelker -> 5 bergarter -> 2 ...

Å definere og kjøre en distribuert jobb i Apache Beam er så enkelt og uttrykksfullt som dette. Til sammenligning er implementering av ordtelling også tilgjengelig på Apache Spark, Apache Flink og Hazelcast Jet.

6. Hvor går vi herfra?

Vi telte hvert ord fra inngangsfilen vår, men vi har ikke en rapport om de hyppigste ordene ennå. Sikkert, sortering a PC-samling er et godt problem å løse som vårt neste trinn.

Senere kan vi lære mer om Windowing, Triggers, Metrics og mer sofistikerte Transforms. Apache Beam Documentation gir grundig informasjon og referansemateriale.

7. Konklusjon

I denne opplæringen lærte vi hva Apache Beam er og hvorfor det foretrekkes fremfor alternativer. Vi demonstrerte også grunnleggende konsepter i Apache Beam med et ordtellingeksempel.

Koden for denne opplæringen er tilgjengelig på GitHub.


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