Nadesłane przez Prithviraj Bose
Oto blog o rzeczach, które musisz wiedzieć o akumulatorach Spark.Z ponieważ jest to kluczowa umiejętność, na którą poluje większość rekruterów IT, jej wzrost i popyt w branży były wykładnicze od samego początku.
Co to są akumulatory?
Akumulatory to zmienne używane do agregowania informacji w modułach wykonawczych. Na przykład te informacje mogą dotyczyć diagnostyki danych lub interfejsu API, na przykład liczby uszkodzonych rekordów lub liczby wywołań określonego interfejsu API biblioteki.
Aby zrozumieć, dlaczego potrzebujemy akumulatorów, zobaczmy mały przykład.
Oto wyimaginowany dziennik transakcji sieci sklepów w centralnym regionie Kalkuty.

Istnieją 4 pola,
Pole 1 -> Miasto
Pole 2 -> Miejscowość
implementacja kolejki priorytetowej w java
Pole 3 -> Kategoria sprzedanego przedmiotu
Pole 4 -> Wartość sprzedanego przedmiotu
Jednak dzienniki mogą być uszkodzone. Na przykład druga linia jest pustą linią, czwarta linia zgłasza pewne problemy z siecią, a ostatnia linia pokazuje zerową wartość sprzedaży (co nie może się zdarzyć!).
Możemy użyć akumulatorów do analizy dziennika transakcji, aby dowiedzieć się, ile pustych logów (puste wiersze), ile razy wystąpiła awaria sieci, jakikolwiek produkt, który nie ma kategorii, a nawet ile razy zanotowano zerową sprzedaż. Pełen przykładowy dziennik można znaleźć tutaj .
Akumulatory mają zastosowanie do każdej operacji, która jest:
1. Przemienne -> f (x, y) = f (y, x) , i
2. Asocjacyjny -> f (f (x, y), z) = f (f (x, z), y) = f (f (y, z), x)
Na przykład, suma i max funkcje spełniają powyższe warunki, podczas gdy średni nie.
Dlaczego warto używać akumulatorów Spark?
Dlaczego potrzebujemy akumulatorów i dlaczego nie używać po prostu zmiennych, jak pokazano w poniższym kodzie.
Problem z powyższym kodem polega na tym, że sterownik drukuje zmienną blankLines jego wartość będzie wynosić zero. Dzieje się tak, ponieważ gdy Spark wysyła ten kod do każdego modułu wykonawczego, zmienne stają się lokalne dla tego modułu wykonawczego, a ich zaktualizowana wartość nie jest przekazywana z powrotem do sterownika. Aby uniknąć tego problemu, musimy zrobić blankLines akumulator taki, że wszystkie aktualizacje tej zmiennej w każdym module wykonawczym są przekazywane z powrotem do sterownika. Zatem powyższy kod powinien być zapisany jako,Gwarantuje to, że akumulator blankLines jest aktualizowany w każdym module wykonawczym, a aktualizacje są przekazywane z powrotem do sterownika.
Możemy zaimplementować inne liczniki błędów sieciowych lub zerowej wartości sprzedaży itp. Pełny kod źródłowy wraz z implementacją pozostałych liczników można znaleźć tutaj .
Osoby zaznajomione z Hadoop Map-Reduce zauważą, że akumulatory Sparka są podobne do liczników Hadoop Map-Reduce.
Ostrzeżenia
Podczas korzystania z akumulatorów istnieją pewne zastrzeżenia, o których my jako programiści musimy być świadomi,
- Obliczenia wewnątrz przemiany są oceniane leniwie, więc chyba że plik akcja dzieje się na RDD przemiany nie są wykonywane. W rezultacie akumulatory używane wewnątrz funkcji takich jak mapa() lub filtr() nie zostanie stracony, chyba że ktoś akcja dzieje się na RDD.
- Spark gwarantuje aktualizację akumulatorów wewnątrz działania tylko raz . Więc nawet jeśli zadanie zostanie ponownie uruchomione i linia rodowa zostanie ponownie obliczona, akumulatory zostaną zaktualizowane tylko raz.
- Spark nie gwarantuje tego przemiany . Więc jeśli zadanie zostanie zrestartowane, a linia zostanie ponownie obliczona, istnieje ryzyko niepożądanych skutków ubocznych, gdy akumulatory zostaną zaktualizowane więcej niż raz.
Aby być po bezpiecznej stronie, zawsze używaj akumulatorów TYLKO w działaniach.
Kod tutaj pokazuje prosty, ale skuteczny przykład, jak to osiągnąć.
Aby uzyskać więcej informacji na temat akumulatorów, przeczytaj to .
Masz do nas pytanie? Wspomnij o nich w sekcji komentarzy, a skontaktujemy się z Tobą.
Powiązane posty:
klasa python __init__