Spark opiera się na koncepcji zbioru danych rozproszonych ze sprężynami (RDD), który jest odpornym na uszkodzenia zbiorem elementów, które mogą być obsługiwane równolegle. Ale nie znalazłem wewnętrznego mechanizmu, w którym RDD zakończyłoby odporność na błędy. Czy ktoś mógłby opisać ten mechanizm? Dzięki.W jaki sposób RDD iskiernika toleruje odporność na uszkodzenia?
Odpowiedz
Pozwolę sobie wyjaśnić w bardzo prosty sposób, jak rozumiem.
Błędy w klastrze mogą się zdarzyć, gdy jeden z węzłów przetwarzających dane ulegnie awarii. W kategoriach iskrzenia, RDD jest dzielony na partycje, a każdy węzeł (nazywany executors
) działa na partycji w dowolnym momencie. (Teoretycznie każdemu z executorów można przypisać wiele zadań w zależności od liczby rdzeni przypisanych do zadania w porównaniu do liczby partycji obecnych w RDD).
To, co się naprawdę dzieje, to szereg funkcji Scala (zwanych transformacjami i działaniami w kategoriach Spark w zależności od tego, czy funkcja jest czysta lub efekt uboczny), wykonywanych na partycji RDD. Operacje te są tworzone razem, a mechanizm wykonywania Spark traktuje je jako skierowany Acykliczny wykres operacji.
Teraz, jeśli określony węzeł ulegnie awarii w trakcie operacji Z, która zależała od operacji Y, która uruchomiła operację X. Menedżer klastra (YARN/Mesos) dowiaduje się, że węzeł jest martwy i próbuje przypisać inny węzeł, aby kontynuować przetwarzanie. Ten węzeł zostanie poinformowany, aby działał na konkretnej partycji RDD i serii operacji X-> Y-> Z (zwanej lineage
), którą musi wykonać, przekazując w scala zamknięciach utworzonych z kodu aplikacji. Teraz nowy węzeł może z powodzeniem kontynuować przetwarzanie i faktycznie nie ma utraty danych.
Spark wykorzystuje również ten mechanizm do zagwarantowania przetwarzania exactly-once
, z zastrzeżeniem, że jakakolwiek operacja, która wywoła efekt podobny do wywołania bazy danych w bloku Spark Action
, może zostać wywołana wiele razy. Ale jeśli przeglądasz swoje przekształcenia jak czyste mapowanie funkcjonalne z jednego RDD na inny, możesz być spokojny, że wynikowe RDD będzie miało tylko jeden element ze źródłowego RDD.
Domena odporności na błędy w Spark jest bardzo obszerna i wymaga znacznie większego wyjaśnienia. Mam nadzieję, że inni wymyślą szczegóły techniczne na temat tego, w jaki sposób jest to realizowane itd. Dzięki za świetny temat.
- 1. Jak ustawić odporność na uszkodzenia akka Aktor?
- 2. W jaki sposób Spark decyduje, jak podzielić partycję RDD?
- 3. Jaki jest skuteczny sposób aktualizowania wartości w RDD Sparka?
- 4. Erlang: odporność na śmierć właściciela portu
- 5. Czy istnieje sposób na zmianę współczynnika replikacji RDD w Spark?
- 6. RDD Agregacja w iskrze
- 7. Spark RDD checkpoint na trwali/buforowane RDD przeprowadzasz DAG dwukrotnie
- 8. Przytulność i odporność na ściskanie w zagnieżdżonych widokach
- 9. Pokaż partycje na pyspark RDD
- 10. Konwertowanie Scala Iterable [tuple] na RDD
- 11. Jak przekonwertować RDD [(String, String)] na RDD [Array [String]]?
- 12. Konwertuj RDD na iterowalny: PySpark?
- 13. Filtr oparty na innym RDD w Spark
- 14. W jaki sposób Spark osiąga kolejność sortowania?
- 15. Jak utworzyć kolekcję RDD z RDD?
- 16. C++: Błąd uszkodzenia dziwnego wskaźnika
- 17. Liczba wierszy w RDD
- 18. RavenDB Stream dla nieograniczonej wyszukiwania - Odporność połączenia
- 19. W jaki sposób wypełnić na mongoosastycznym?
- 20. W jaki sposób działa syscall na Linuksie?
- 21. Pyspark: shuffle RDD
- 22. Demultipleksowanie RDD na wiele tabel ORC
- 23. Podział RDD na walidację K-krotność: pyspark
- 24. Scala Spark: Podział kolekcji na kilka RDD?
- 25. Filtr RDD oparty na numerze wiersza
- 26. Spark - scala: shuffle RDD/split RDD na dwie losowe części losowo
- 27. Apache Spark: Jak przekonwertować urządzenie Spark DataFrame na RDD z typem RDD [(Type1, Type2, ...)]?
- 28. W jaki sposób OS X ładuje aplikację opartą na scenorysach i w jaki sposób zarządza oknami?
- 29. Broadcast słownikiem do RDD w PySpark
- 30. Spark - wiele filtrów na RDD w jednym przebiegu