Gnistackumulatorer förklarade: Apache Spark



Den här Apache Spark-bloggen förklarar Spark-ackumulatorer i detalj. Lär dig användning av gnistackumulator med exempel. Gnistackumulatorer är som Hadoop Mapreduce-räknare.

Bidrag från Prithviraj Bose

Här är en blogg om de saker du behöver veta om Spark-ackumulatorer.Med är en nyckelfärdighet som de flesta IT-rekryterare jagar efter, dess tillväxt och efterfrågan i branschen har varit exponentiell sedan starten.





Vad är ackumulatorer?

Ackumulatorer är variabler som används för att sammanställa information över exekutörerna. Till exempel kan den här informationen avse data eller API-diagnos som hur många poster som är skadade eller hur många gånger ett visst biblioteks-API anropades.

Låt oss se ett litet exempel för att förstå varför vi behöver ackumulatorer.



c ++ Fibi-serie

Här är en imaginär logg över transaktioner från en butikskedja runt den centrala regionen Kolkata.

logs-Spark-accumulators

Det finns fyra fält,

Fält 1 -> Stad



Fält 2 -> Lokalitet

Fält 3 -> Såld kategori

Fält 4 -> Värde på sålt objekt

Loggarna kan dock skadas. Till exempel är den andra raden en tom rad, den fjärde raden rapporterar några nätverksproblem och slutligen visar den sista raden ett försäljningsvärde på noll (vilket inte kan hända!).

Vi kan använda ackumulatorer för att analysera transaktionsloggen för att ta reda på antalet tomma loggar (tomma rader), antalet gånger nätverket misslyckades, varje produkt som inte har en kategori eller till och med antalet gånger noll försäljning registrerades. Hela provloggen finns här .
Ackumulatorer är tillämpliga på alla operationer som är,
1. Kommutativ -> f (x, y) = f (y, x) och
2. Associativ -> f (f (x, y), z) = f (f (x, z), y) = f (f (y, z), x)
Till exempel, belopp och max funktioner uppfyller ovanstående villkor medan genomsnitt gör inte.

Varför använda gnistackumulatorer?

Nu varför behöver vi ackumulatorer och varför inte bara använda variabler som visas i koden nedan.

hur man ansluter mysql-databasen i java
Problemet med koden ovan är att när drivrutinen skriver ut variabeln blankLines dess värde blir noll. Detta beror på att när Spark skickar den här koden till varje exekutör blir variablerna lokala för den exekutören och dess uppdaterade värde skickas inte tillbaka till drivrutinen. För att undvika detta problem måste vi göra blankLines en ackumulator så att alla uppdateringar till denna variabel i varje exekutör vidarebefordras till föraren. Så ovanstående kod ska skrivas som,

Detta garanterar att ackumulatorn blankLines uppdateras över alla exekutörer och uppdateringarna vidarebefordras till föraren.

passera förbi värde kontra passera referens Java

Vi kan implementera andra räknare för nätverksfel eller noll försäljningsvärde etc. Hela källkoden tillsammans med implementeringen av de andra räknarna finns här .

Personer som är bekanta med Hadoop Map-Reduce kommer att märka att Sparks ackumulatorer liknar Hadoop's Map-Reduce-räknare.

Förbehåll

När vi använder ackumulatorer finns det några försiktighetsåtgärder som vi som programmerare måste vara medvetna om,

  1. Beräkningar inuti omvandlingar utvärderas lat, så om inte ett handling händer på RDD den omvandlingar exekveras inte. Som ett resultat av detta använde ackumulatorer funktioner som Karta() eller filtrera() kommer inte att avrättas om inte några handling hända på RDD.
  2. Spark garanterar att uppdatera ackumulatorer inuti åtgärder bara en gång . Så även om en uppgift startas om och linjen beräknas om kommer ackumulatorerna att uppdateras bara en gång.
  3. Spark garanterar inte detta för omvandlingar . Så om en uppgift startas om och linjen beräknas om finns det risk för oönskade biverkningar när ackumulatorerna kommer att uppdateras mer än en gång.

För att vara på den säkra sidan, använd alltid ENDAST ackumulatorer i åtgärder.
Koden här visar ett enkelt men ändå effektivt exempel på hur man uppnår detta.
Läs mer om ackumulatorer detta .

Har du en fråga till oss? Nämn dem i kommentarsektionen så återkommer vi till dig.

Relaterade inlägg:

Apache Spark combineByKey Explained