2016-08-28 11 views
7

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

16

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.

Powiązane problemy