Gnistakkumulatorer forklart: Apache Spark

Denne Apache Spark-bloggen forklarer Gnistakkumulatorer i detalj. Lær bruk av gnistakkumulator med eksempler. Gnistakkumulatorer er som Hadoop Mapreduce-tellere.

Bidratt av Prithviraj Bose

Her er en blogg om ting du trenger å vite om Spark-akkumulatorer.Med å være en nøkkelferdighet som de fleste IT-rekrutterere jakter på, har veksten og etterspørselen i bransjen vært eksponentiell siden starten.



Hva er akkumulatorer?

Akkumulatorer er variabler som brukes til å samle informasjon på tvers av utførerne. For eksempel kan denne informasjonen gjelde data- eller API-diagnose, for eksempel hvor mange poster som er ødelagt eller hvor mange ganger et bestemt biblioteks-API ble kalt.

La oss se et lite eksempel for å forstå hvorfor vi trenger akkumulatorer.

Her er en tenkt logg over transaksjoner fra en butikkjede rundt den sentrale Kolkata-regionen.

logs-Spark-accumulators

Det er fire felt,

hvordan du bruker goto i c ++

Felt 1 -> By

Felt 2 -> Lokalitet

Felt 3 -> Kategori solgt vare

Felt 4 -> Verdien av solgte varer

Loggene kan imidlertid bli ødelagt. For eksempel er den andre linjen en tom linje, den fjerde linjen rapporterer om noen nettverksproblemer, og til slutt viser den siste linjen en salgsverdi på null (som ikke kan skje!).

Vi kan bruke akkumulatorer til å analysere transaksjonsloggen for å finne ut antall tomme logger (blanke linjer), antall ganger nettverket mislyktes, ethvert produkt som ikke har en kategori eller til og med antall ganger null salg ble registrert. Fullstendig prøvelogg finner du her .
Akkumulatorer gjelder for alle operasjoner som er,
1. Kommutativ -> f (x, y) = f (y, x) , og
2. Assosiativ -> f (f (x, y), z) = f (f (x, z), y) = f (f (y, z), x)
For eksempel, sum og maks funksjoner tilfredsstiller ovennevnte betingelser mens gjennomsnitt gjør ikke.

Hvorfor bruke gnistakkumulatorer?

Nå hvorfor trenger vi akkumulatorer og hvorfor ikke bare bruke variabler som vist i koden nedenfor.

Problemet med koden ovenfor er at når driveren skriver ut variabelen blankLines verdien vil være null. Dette er fordi når Spark sender denne koden til hver utfører, blir variablene lokale for den utføreren, og den oppdaterte verdien blir ikke videreformidlet til driveren. For å unngå dette problemet må vi lage blankLines en akkumulator slik at alle oppdateringene til denne variabelen i hver utfører blir videreformidlet til driveren. Så koden ovenfor skal skrives som,

Dette garanterer at akkumulatoren blankLines oppdateres på tvers av alle utførere, og oppdateringene videresendes tilbake til driveren.

Vi kan implementere andre tellere for nettverksfeil eller null salgsverdi, etc. Full kildekode sammen med implementeringen av de andre tellerne kan bli funnet her .

Folk som er kjent med Hadoop Map-Reduce, vil legge merke til at Sparks akkumulatorer ligner på Hadoop's Map-Reduce-tellere.

Advarsler

Når du bruker akkumulatorer, er det noen advarsler som vi som programmerere må være klar over,

  1. Beregninger inni transformasjoner blir evaluert lat, så med mindre en handling skjer på RDD den transformasjoner blir ikke henrettet. Som et resultat av dette brukte akkumulatorer funksjoner som kart() eller filter() vil ikke bli henrettet med mindre noen handling skje på RDD.
  2. Spark garanterer å oppdatere akkumulatorer innsiden handlinger bare én gang . Så selv om en oppgave startes på nytt og avstamningen beregnes på nytt, vil akkumulatorene bare oppdateres en gang.
  3. Spark garanterer ikke dette for transformasjoner . Så hvis en oppgave startes på nytt og avstamningen beregnes på nytt, er det sjanser for uønskede bivirkninger når akkumulatorene blir oppdatert mer enn en gang.

For å være på den sikre siden, bruk alltid KUN akkumulatorer i handlinger.
Koden her viser et enkelt, men effektivt eksempel på hvordan du kan oppnå dette.
For mer informasjon om akkumulatorer, les dette .

Har du et spørsmål til oss? Nevn dem i kommentarseksjonen, så kommer vi tilbake til deg.

Relaterte innlegg:

forskjeller mellom abstrakt klasse og grensesnitt

Apache Spark combineByKey Explained