Gnistakkumulatorer forklaret: Apache Spark



Denne Apache Spark-blog forklarer Gnistakkumulatorer i detaljer. Lær brugen af ​​gnistakkumulator med eksempler. Gnistakkumulatorer er som Hadoop Mapreduce-tællere.

Bidrag fra Prithviraj Bose

Her er en blog om de ting, du har brug for at vide om gnistakkumulatorer.Med at være en nøglefærdighed, som de fleste it-rekrutterere jager på, har dens vækst og efterspørgsel i branchen været eksponentiel siden starten.





hvordan man konverterer en dobbelt til en int

Hvad er akkumulatorer?

Akkumulatorer er variabler, der bruges til at samle information på tværs af eksekutørerne. For eksempel kan disse oplysninger vedrøre data eller API-diagnose, f.eks. Hvor mange poster der er beskadiget, eller hvor mange gange et bestemt biblioteks-API blev kaldt.

Lad os se et lille eksempel for at forstå, hvorfor vi har brug for akkumulatorer.



Her er en imaginær log af transaktioner fra en kæde af butikker rundt om det centrale Kolkata-område.

logs-Spark-accumulators

Der er 4 felter,

Felt 1 -> By



Felt 2 -> Lokalitet

Felt 3 -> Kategori af solgt vare

Felt 4 -> Værdien af ​​den solgte vare

Logfilerne kan dog blive beskadiget. For eksempel er den anden linje en tom linje, den fjerde linje rapporterer nogle netværksproblemer, og til sidst viser den sidste linje en salgsværdi på nul (hvilket ikke kan ske!).

Vi kan bruge akkumulatorer til at analysere transaktionsloggen for at finde ud af antallet af blanke logfiler (blanke linjer), antallet af gange, netværket mislykkedes, ethvert produkt, der ikke har en kategori eller endda antallet af nul salg blev registreret. Den fulde prøvelog kan findes her .
Akkumulatorer er anvendelige til enhver operation, der er,
1. Kommutativ -> f (x, y) = f (y, x) og
2. Associerende -> f (f (x, y), z) = f (f (x, z), y) = f (f (y, z), x)
For eksempel, sum og maks funktioner opfylder ovenstående betingelser, mens gennemsnit gør ikke.

Hvorfor bruge gnistakkumulatorer?

Nu hvorfor har vi brug for akkumulatorer, og hvorfor ikke bare bruge variabler som vist i koden nedenfor.

Problemet med ovenstående kode er, at når driveren udskriver variablen blankLines dens værdi er nul. Dette skyldes, at når Spark sender denne kode til hver eksekutor, bliver variablerne lokale for den pågældende eksekutor, og dens opdaterede værdi videresendes ikke tilbage til driveren. For at undgå dette problem skal vi lave blankLines en akkumulator, således at alle opdateringer til denne variabel i hver eksekutor videresendes tilbage til driveren. Så ovenstående kode skal skrives som,

Dette garanterer, at akkumulatoren blankLines opdateres på tværs af hver eksekutor, og opdateringerne videresendes tilbage til driveren.

Vi kan implementere andre tællere til netværksfejl eller nul salgsværdi osv. Den fulde kildekode sammen med implementeringen af ​​de andre tællere kan findes her .

Folk, der er fortrolige med Hadoop Map-Reduce, vil bemærke, at Sparks akkumulatorer ligner Hadoop's Map-Reduce-tællere.

Advarsler

Når du bruger akkumulatorer, er der nogle advarsler, som vi som programmører skal være opmærksomme på,

  1. Beregninger indeni transformationer vurderes doven, så medmindre en handling sker på RDD den transformationer udføres ikke. Som et resultat af dette brugte akkumulatorer inde i funktioner som f.eks kort() eller filter() bliver ikke henrettet, medmindre nogle handling ske på RDD.
  2. Spark garanterer at opdatere akkumulatorer inde handlinger kun én gang . Så selvom en opgave genstartes, og slægten genberegnes, opdateres akkumulatorerne kun en gang.
  3. Spark garanterer ikke dette for transformationer . Så hvis en opgave genstartes, og slægten genberegnes, er der chancer for uønskede bivirkninger, når akkumulatorerne opdateres mere end en gang.

For altid at være på den sikre side skal du KUN bruge akkumulatorer inden for handlinger.
Koden her viser et simpelt, men effektivt eksempel på, hvordan man opnår dette.
For mere information om akkumulatorer, læs dette .

Har du et spørgsmål til os? Nævn dem i kommentarsektionen, så vender vi tilbage til dig.

Relaterede indlæg:

Apache Spark combineByKey forklaret