Introduktion til Apache Beam

1. Oversigt

I denne vejledning introducerer vi Apache Beam og udforsker dens grundlæggende koncepter.

Vi starter med at demonstrere brugssagen og fordelene ved at bruge Apache Beam, og derefter dækker vi grundlæggende begreber og terminologier. Derefter går vi gennem et simpelt eksempel, der illustrerer alle de vigtige aspekter af Apache Beam.

2. Hvad er Apache Beam?

Apache Beam (Batch + strEAM) er en samlet programmeringsmodel til batch- og streaming-databehandlingsjob. Det leverer et softwareudviklingssæt til at definere og konstruere rørledninger til databehandling såvel som løbere til at udføre dem.

Apache Beam er designet til at give et bærbart programmeringslag. Faktisk oversætter Beam Pipeline Runners databehandlingsrørledningen til API'en, der er kompatibel med backend efter brugerens valg. I øjeblikket understøttes disse distribuerede behandlingsbackend:

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

3. Hvorfor Apache Beam?

Apache Beam smelter batch- og streaming-databehandling, mens andre ofte gør det via separate API'er. Derfor er det meget nemt at ændre en streamingproces til en batchproces og omvendt, for eksempel når kravene ændres.

Apache Beam hæver bærbarhed og fleksibilitet. Vi fokuserer på vores logik snarere end de underliggende detaljer. Desuden kan vi til enhver tid ændre databehandlingsbackend.

Der er Java, Python, Go og Scala SDK'er tilgængelige til Apache Beam. Faktisk kan alle på holdet bruge det med deres valgte sprog.

4. Grundlæggende begreber

Med Apache Beam kan vi konstruere workflowgrafer (pipelines) og udføre dem. Nøglebegreberne i programmeringsmodellen er:

  • PC-samling - repræsenterer et datasæt, som kan være en fast batch eller en datastrøm
  • PTransform - en databehandlingsoperation, der tager en eller flere PC-samlings og output nul eller mere PC-samlings
  • Rørledning - repræsenterer en rettet acyklisk graf af PC-samling og PTransform, og indkapsler derfor hele databehandlingsjobbet
  • PipelineRunner - udfører en Rørledning på en specificeret distribueret behandlingsbackend

Kort sagt, en PipelineRunner udfører en Rørledning, og en Rørledning består af PC-samling og PTransform.

5. Ordtællingseksempel

Nu hvor vi har lært de grundlæggende begreber i Apache Beam, lad os designe og teste en ordtællingsopgave.

5.1. Konstruktion af en strålerørledning

At designe workflowgrafen er det første trin i hvert Apache Beam-job. Lad os definere trinene i en ordtællingsopgave:

  1. Læs teksten fra en kilde.
  2. Opdel teksten i en liste med ord.
  3. Små bogstaver.
  4. Trim punkteringer.
  5. Filtrer stopord.
  6. Tæl hvert unikke ord.

For at opnå dette skal vi konvertere ovenstående trin til en enkelt Rørledning ved brug af PC-samling og PTransform abstraktioner.

5.2. Afhængigheder

Før vi kan implementere vores workflowgraf, skal vi tilføje Apache Beams kerneafhængighed til vores projekt:

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

Beam Pipeline Runners er afhængige af en distribueret behandlingsbackend til at udføre opgaver. Lad os tilføje DirectRunner som en runtime-afhængighed:

 org.apache.beam beam-runners-direct-java $ {beam.version} runtime 

I modsætning til andre rørledningsløbere, DirectRunner behøver ikke nogen yderligere opsætning, hvilket gør det til et godt valg for startere.

5.3. Implementering

Apache Beam bruger Map-Reduce programmeringsparadigmet (det samme som Java Streams). Faktisk er det en god idé at have et grundlæggende koncept for reducere(), filter(), tælle(), kort()og flatMap () inden vi fortsætter.

Oprettelse af en Rørledning er den første ting, vi gør:

Valgmuligheder for PipelineOptions = PipelineOptionsFactory.create (); Pipeline p = Pipeline.create (optioner);

Nu anvender vi vores seks-trins ordtællingsopgave:

PC-samling wordCount = p .apply ("(1) Læs alle linjer", TextIO.read (). fra (inputFilePath)) .apply ("(2) Flatmap til en ordliste", FlatMapElements.into (TypeDescriptors.strings () ) .via (line -> Arrays.asList (line.split ("\ s")))) .apply ("(3) Små bogstaver", MapElements.into (TypeDescriptors.strings ()) .via (word - > word.toLowerCase ())) .apply ("(4) Trim tegnsætning", 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 (valgfri) argument af ansøge() er en Snor det er kun for bedre læsbarhed af koden. Her er hvad hver ansøge() gør i ovenstående kode:

  1. Først læser vi en input-tekstfil linje for linje ved hjælp af TextIO.
  2. Ved at opdele hver linje efter mellemrum, kortlægger vi den til en ordliste.
  3. Ordtælling er ikke skiftende på store og små bogstaver, så vi gemmer alle ord på små bogstaver.
  4. Tidligere delte vi linjer efter mellemrum og ender med ord som “ord!” og “word?”, så vi fjerner tegnsætning.
  5. Stopord som “er” og “ved” er hyppige i næsten enhver engelsk tekst, så vi fjerner dem.
  6. Endelig tæller vi unikke ord ved hjælp af den indbyggede funktion Count.perElement ().

Som tidligere nævnt behandles rørledninger på en distribueret backend. Det er ikke muligt at gentage over en PC-samling i hukommelsen, da den er fordelt på flere backends. I stedet for skriver vi resultaterne til en ekstern database eller fil.

Først konverterer vi vores PC-samling til Snor. Så bruger vi TextIO at skrive output:

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

Nu hvor vores Rørledning definitionen er komplet, kan vi køre og teste den.

5.4. Løb og test

Indtil videre har vi defineret en Rørledning til ordtællingsopgaven. Lad os på dette tidspunkt køre Rørledning:

p.run (). waitUntilFinish ();

På denne linje kode sender Apache Beam vores opgave til flere DirectRunner tilfælde. Derfor genereres flere outputfiler i slutningen. De indeholder ting som:

... apache -> 3 stråler -> 5 klipper -> 2 ...

At definere og køre et distribueret job i Apache Beam er så simpelt og udtryksfuldt som dette. Til sammenligning er implementering af ordtælling også tilgængelig på Apache Spark, Apache Flink og Hazelcast Jet.

6. Hvor skal vi hen herfra?

Vi har med succes talt hvert ord fra vores inputfil, men vi har ikke en rapport om de hyppigste ord endnu. Bestemt sortering a PC-samling er et godt problem at løse som vores næste trin.

Senere kan vi lære mere om Windowing, Triggers, Metrics og mere sofistikerede Transforms. Apache Beam Documentation giver dybdegående information og referencemateriale.

7. Konklusion

I denne vejledning lærte vi, hvad Apache Beam er, og hvorfor det foretrækkes frem for alternativer. Vi demonstrerede også grundlæggende begreber i Apache Beam med et ordtællingseksempel.

Koden til denne tutorial er tilgængelig på GitHub.


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