Vysvětlení akumulátorů Spark: Apache Spark



Tento blog Apache Spark podrobně vysvětluje akumulátory Spark. Naučte se použití akumulátoru Spark s příklady. Akumulátory jisker jsou jako počitadla Hadoop Mapreduce.

Přispěl Prithviraj Bose

Zde je blog o věcech, které potřebujete vědět o akumulátorech Spark.S jako klíčová dovednost, po které většina náborářů IT usiluje, je její růst a poptávka v tomto odvětví exponenciální již od svého vzniku.





Co jsou akumulátory?

Akumulátory jsou proměnné, které se používají pro agregaci informací mezi exekutory. Například se tyto informace mohou týkat dat nebo diagnostiky API, například kolik záznamů je poškozeno nebo kolikrát bylo voláno konkrétní API knihovny.

Abychom pochopili, proč potřebujeme akumulátory, podívejme se na malý příklad.



Zde je imaginární protokol transakcí řetězce obchodů v centrální oblasti Kalkaty.

final konečně finalizovat v Javě
logs-Spark-accumulators

K dispozici jsou 4 pole,

Pole 1 -> Město



Pole 2 -> Lokalita

Pole 3 -> Kategorie prodaného zboží

Pole 4 -> Hodnota prodaného zboží

Protokoly však mohou být poškozeny. Například druhý řádek je prázdný řádek, čtvrtý řádek hlásí některé problémy se sítí a nakonec poslední řádek ukazuje nulovou hodnotu prodeje (což se nemůže stát!).

Můžeme použít akumulátory k analýze protokolu transakcí, abychom zjistili počet prázdných protokolů (prázdné řádky), kolikrát selhala síť, jakýkoli produkt, který nemá kategorii, nebo dokonce počet zaznamenaných nulových prodejů. Celý ukázkový protokol najdete tady .
Akumulátory jsou použitelné pro všechny operace, které jsou
1. Komutativní -> f (x, y) = f (y, x) , a
2. Asociativní -> f (f (x, y), z) = f (f (x, z), y) = f (f (y, z), x)
Například, součet a max funkce splňují výše uvedené podmínky, zatímco průměrný ne.

Proč používat Spark akumulátory?

Proč tedy potřebujeme akumulátory a proč nepoužívat pouze proměnné, jak je uvedeno v níže uvedeném kódu.

Problém s výše uvedeným kódem spočívá v tom, že když ovladač vytiskne proměnnou prázdné řádky jeho hodnota bude nulová. Je to proto, že když Spark dodává tento kód každému exekutorovi, proměnné se stanou lokálními pro tohoto exekutora a jeho aktualizovaná hodnota není předána zpět ovladači. Abychom se tomuto problému vyhnuli, musíme udělat prázdné řádky akumulátor, takže všechny aktualizace této proměnné v každém exekutoru jsou přeneseny zpět do ovladače. Výše uvedený kód by tedy měl být napsán jako,

To zaručuje, že akumulátor prázdné řádky je aktualizován u každého exekutora a aktualizace jsou přenášeny zpět do ovladače.

Můžeme implementovat další čítače pro síťové chyby nebo nulovou hodnotu prodeje atd. Celý zdrojový kód spolu s implementací ostatních čítačů najdete tady .

Lidé obeznámení s Hadoop Map-Reduce si všimnou, že Sparkovy akumulátory jsou podobné počítadlům Hadoop Map-Reduce.

co je parametr v tablo

Upozornění

Při používání akumulátorů jsou některé námitky, kterých si jako programátoři musíme být vědomi,

  1. Výpočty uvnitř transformace jsou hodnoceny líně, takže pokud akce se stane na RDD transformace nejsou provedeny. V důsledku toho akumulátory používané uvnitř funkcí jako mapa() nebo filtr() zvyklý být popraven, pokud nějaký akce stane se na RDD.
  2. Spark zaručuje aktualizaci akumulátorů uvnitř akce pouze jednou . Takže i když je úkol restartován a linie je přepočítána, akumulátory budou aktualizovány pouze jednou.
  3. Spark to nezaručuje transformace . Pokud je tedy úkol restartován a počet řádků je přepočítán, existuje pravděpodobnost nežádoucích vedlejších účinků, když budou akumulátory aktualizovány více než jednou.

Pro jistotu vždy používejte POUZE akumulátory uvnitř akcí.
Kód tady ukazuje jednoduchý, ale účinný příklad, jak toho dosáhnout.
Další informace o akumulátorech najdete v článku tento .

Máte na nás dotaz? Uveďte je v sekci komentářů a my se vám ozveme.

Související příspěvky:

Apache Spark combineByKey vysvětleno