Co to są pracownicy, wykonawcy, rdzenie w klastrze Spark Standalone?

219

Przeczytałem Omówienie trybu klastrowego i nadal nie rozumiem różnych procesów w klastrze autonomicznym Spark i równoległości.

Czy pracownik jest procesem JVM, czy nie? Uruchomiłem bin\start-slave.shi okazało się, że spawnował on robot, którym w rzeczywistości jest JVM.

Zgodnie z powyższym linkiem, executor jest procesem uruchomionym dla aplikacji w węźle pracownika, który uruchamia zadania. Wykonawca jest również maszyną JVM.

Oto moje pytania:

  1. Wykonawcy są na aplikację. Jaka jest zatem rola pracownika? Czy koordynuje to z executorem i przekazuje wynik z powrotem do sterownika? Czy kierowca rozmawia bezpośrednio z wykonawcą? Jeśli tak, to jaki jest cel pracownika?

  2. Jak kontrolować liczbę wykonawców aplikacji?

  3. Czy zadania mogą być uruchamiane równolegle w executorze? Jeśli tak, jak skonfigurować liczbę wątków dla modułu wykonującego?

  4. Jaka jest relacja między pracownikiem, wykonawcami i rdzeniami executorów (--total-executor-core)?

  5. Co to znaczy mieć więcej pracowników na węzeł?

Zaktualizowano

Weźmy przykłady, aby lepiej zrozumieć.

Przykład 1: Autonomiczny klaster z 5 węzłami roboczymi (każdy węzeł ma 8 rdzeni) Gdy uruchamiam aplikację z ustawieniami domyślnymi.

Przykład 2 Taka sama konfiguracja klastra jak w przykładzie 1, ale uruchamiam aplikację z następującymi ustawieniami - core-executor 10 - total-executor-core 10.

Przykład 3 Taka sama konfiguracja klastra jak w przykładzie 1, ale uruchamiam aplikację z następującymi ustawieniami - core-executor 10 - total-executor-core 50.

Przykład 4 Taka sama konfiguracja klastra jak w przykładzie 1, ale uruchamiam aplikację z następującymi ustawieniami - core-executor 50 - total-executor-core 50.

Przykład 5 Taka sama konfiguracja klastra jak w przykładzie 1, ale uruchamiam aplikację z następującymi ustawieniami - core-executor 50 - total-executor-core 10.

W każdym z tych przykładów, ilu wykonawców? Ile wątków na executora? Ile rdzeni? Jak decyduje liczba wykonawców na aplikację? Czy zawsze jest taka sama jak liczba pracowników?

Manikandan Kannan
źródło

Odpowiedzi:

274

wprowadź opis zdjęcia tutaj

Spark wykorzystuje architekturę master / slave. Jak widać na rysunku, ma on jednego centralnego koordynatora (kierowcę), który komunikuje się z wieloma rozproszonymi pracownikami (wykonawcami). Sterownik i każdy z wykonawców działają we własnych procesach Java.

KIEROWCA

Sterownik to proces, w którym działa główna metoda. Najpierw konwertuje program użytkownika na zadania, a następnie planuje zadania w executorach.

WYKONAWCY

Wykonawcy to procesy węzłów roboczych odpowiedzialne za uruchamianie poszczególnych zadań w danym zadaniu Spark. Są uruchamiane na początku aplikacji Spark i zazwyczaj działają przez cały okres użytkowania aplikacji. Po uruchomieniu zadania wysyłają wyniki do sterownika. Zapewniają również pamięć w pamięci dla RDD, które są buforowane przez programy użytkownika za pomocą Block Managera.

PRZEPŁYW REALIZACJI APLIKACJI

Mając to na uwadze, składając wniosek do klastra za pomocą Spark-Prześlij, dzieje się to wewnętrznie:

  1. Autonomiczna aplikacja uruchamia się i tworzy instancję SparkContext instancję instancji (i dopiero wtedy można wywołać aplikację jako sterownik).
  2. Program sterownika prosi menedżera klastra o zasoby do uruchomienia programów wykonawczych.
  3. Menedżer klastra uruchamia narzędzia wykonawcze.
  4. Proces sterownika przebiega przez aplikację użytkownika. W zależności od działań i przekształceń przez RDD zadania są wysyłane do wykonawców.
  5. Wykonawcy wykonują zadania i zapisują wyniki.
  6. Jeśli jakiś pracownik ulegnie awarii, jego zadania zostaną wysłane do różnych wykonawców w celu ponownego przetworzenia. W książce „Learning Spark: Błyskawiczna analiza dużych zbiorów danych” mówią o Spark i tolerancji błędów:

Spark automatycznie radzi sobie z uszkodzonymi lub wolnymi maszynami poprzez ponowne wykonanie nieudanych lub wolnych zadań. Na przykład, jeśli węzeł z partycją operacji map () ulegnie awarii, Spark uruchomi ją ponownie w innym węźle; i nawet jeśli węzeł nie ulega awarii, ale jest po prostu znacznie wolniejszy niż inne węzły, Spark może zapobiegawczo uruchomić „spekulacyjną” kopię zadania na innym węźle i przyjąć wynik, jeśli to się skończy.

  1. Dzięki SparkContext.stop () ze sterownika lub jeśli główna metoda kończy działanie / ulega awarii, wszystkie moduły wykonawcze zostaną zakończone, a zasoby klastra zostaną zwolnione przez menedżera klastra.

TWOJE PYTANIA

  1. Po uruchomieniu executorów rejestrują się w sterowniku i od tego momentu komunikują się bezpośrednio. Pracownicy są odpowiedzialni za informowanie menedżera klastra o dostępności ich zasobów.

  2. W klastrze YARN możesz to zrobić za pomocą --num-executors. W autonomicznym klastrze otrzymasz jednego executora na pracownika, chyba że grasz z spark.executor.cores, a pracownik ma wystarczającą liczbę rdzeni, aby pomieścić więcej niż jednego executora. (Jak zauważył @JacekLaskowski, --num-executors nie jest już używany w YARN https://github.com/apache/spark/commit/16b6d18613e150c7038c613992d80a7828413e66 )

  3. Za pomocą opcji --executor-core można przypisać liczbę rdzeni na moduł wykonujący

  4. --total-executor-core - maksymalna liczba rdzeni executora na aplikację

  5. Jak powiedział Sean Owen w tym wątku : „nie ma dobrego powodu, aby uruchamiać więcej niż jednego pracownika na maszynę”. Na przykład wiele JVM siedzi na jednej maszynie.

AKTUALIZACJA

Nie byłem w stanie przetestować tych scenariuszy, ale zgodnie z dokumentacją:

PRZYKŁAD 1: Spark zachłannie pozyska tyle rdzeni i wykonawców, ile oferuje program planujący. W końcu otrzymasz 5 wykonawców z 8 rdzeniami.

PRZYKŁAD 2 do 5: Spark nie będzie mógł przydzielić tylu rdzeni, ile zażąda jeden pracownik, dlatego żaden program wykonawczy nie zostanie uruchomiony.

Marco
źródło
Dzięki @Marco. Tak więc zazwyczaj nie należy się martwić pamięcią sterty na pracowniku, ponieważ tylko zarządza on zasobami węzła?
Manikandan Kannan
8
Co za świetna odpowiedź! Dzięki @Marco. Zgodnie z github.com/apache/spark/commit/… --num-executors nie są już używane w YARN.
Jacek Laskowski,
1
@Marco dzięki za świetną odpowiedź. Czy możesz rozwinąć bieżącą rolę menedżera klastra podczas działania sterownika? ... Musi poradzić sobie ze sprawą, w której kierowca lub pracownicy, albo awaria, albo przestają odpowiadać, aby wiedzieć, jakie zasoby są dostępne.
Iain,
1
@lain sterownik kontaktuje się z menedżerem klastra w celu alokacji zasobów, a także prosi mgr klastra o uruchomienie executorów
Aravind Yarram
2
Świetna odpowiedź. Szczegółowe informacje o iskierach
Amar Gajbhiye,
7

Oto jak Apache Spark działa wewnętrznie:

wprowadź opis zdjęcia tutaj

Sharhabeel Hamdan
źródło