Załóżmy, że w każdym momencie działa tylko jedno zadanie Spark.
Co mam do tej pory
Oto, co rozumiem, co dzieje się w Spark:
- Po
SparkContext
utworzeniu węzła roboczego każdy węzeł roboczy uruchamia moduł wykonawczy. Executory to oddzielne procesy (JVM), które łączą się z powrotem z programem sterownika. Każdy executor ma słoik z programem sterownika. Zamknięcie sterownika powoduje wyłączenie wykonawców. Każdy executor może posiadać kilka partycji. - Po wykonaniu zadania tworzony jest plan wykonania zgodnie z wykresem rodowodowym.
- Zadanie wykonania jest podzielone na etapy, w których etapy zawierają tyle samo sąsiednich (na wykresie rodowodowym) transformacji i akcji, ale bez tasowań. Tak więc etapy są oddzielone tasowaniem.
Rozumiem, że
- Zadanie to polecenie wysyłane ze sterownika do modułu wykonawczego przez serializację obiektu Function.
- Wykonawca deserializuje (za pomocą pliku jar sterownika) polecenie (zadanie) i wykonuje je na partycji.
ale
Pytania)
Jak podzielić etap na te zadania?
Konkretnie:
- Czy zadania są zdeterminowane przez transformacje i działania, czy też może to być wiele przekształceń / działań w zadaniu?
- Czy zadania są określane przez partycję (np. Jedno zadanie na etap na partycję).
- Czy zadania są określane przez węzły (np. Jedno zadanie na etap na węzeł)?
Co myślę (tylko częściowa odpowiedź, nawet jeśli słuszna)
W https://0x0fff.com/spark-architecture-shuffle tasowanie jest wyjaśnione za pomocą obrazu
i mam wrażenie, że taka jest zasada
każdy etap jest podzielony na # zadania związane z liczbą partycji, bez względu na liczbę węzłów
W przypadku mojego pierwszego obrazu powiedziałbym, że mam 3 zadania mapy i 3 zadania redukcji.
W przypadku obrazu z 0x0fff powiedziałbym, że jest 8 zadań mapy i 3 zadania redukcji (zakładając, że są tylko trzy pomarańczowe i trzy ciemnozielone pliki).
W każdym razie pytania otwarte
Czy to jest poprawne? Ale nawet jeśli to prawda, nie na wszystkie moje pytania powyżej udzielono odpowiedzi, ponieważ nadal pozostaje otwarte, czy wiele operacji (np. Wiele map) znajduje się w ramach jednego zadania, czy też są one podzielone na jedno zadanie na operację.
Co mówią inni
Co to jest zadanie w Spark? W jaki sposób pracownik Spark wykonuje plik jar? i jak program planujący Apache Spark dzieli pliki na zadania? są podobne, ale nie czułem, że na moje pytanie udzielono jasnej odpowiedzi.
źródło
sum(..)
wziął pod uwagę tę zmienność.To może pomóc ci lepiej zrozumieć różne elementy:
źródło
Jeśli dobrze rozumiem, są 2 (powiązane) rzeczy, które Cię mylą:
1) Od czego zależy treść zadania?
2) Od czego zależy liczba zadań do wykonania?
Silnik Sparka „skleja” proste operacje na kolejnych rdds, na przykład:
więc kiedy rdd3 jest (leniwie) obliczane, Spark wygeneruje zadanie na partycję rdd1 i każde zadanie wykona zarówno filtr, jak i mapę na wiersz, aby uzyskać rdd3.
Liczba zadań zależy od liczby partycji. Każdy RDD ma określoną liczbę partycji. W przypadku źródłowego RDD odczytywanego z HDFS (na przykład za pomocą sc.textFile (...)) liczba partycji to liczba podziałów wygenerowanych przez format wejściowy. Niektóre operacje na RDD mogą skutkować RDD z inną liczbą partycji:
Innym przykładem są złączenia:
(Większość) operacji zmieniających liczbę partycji wiąże się z tasowaniem, kiedy robimy na przykład:
co właściwie się dzieje, to zadanie na każdej partycji rdd1 musi wygenerować końcowe wyjście, które może zostać odczytane przez następny etap, tak aby rdd2 miał dokładnie 1000 partycji (jak oni to robią? Hash lub Sort ). Zadania po tej stronie są czasami nazywane „Zadaniami mapy (pobocznymi)”. Zadanie, które zostanie później uruchomione na rdd2, będzie działało na jednej partycji (rdd2!) I będzie musiało wymyślić, jak odczytać / połączyć wyjścia po stronie mapy dotyczące tej partycji. Zadania po tej stronie są czasami nazywane „Zmniejsz liczbę zadań (pobocznych)”.
Dwa pytania są ze sobą powiązane: liczba zadań na etapie to liczba przegród (wspólna dla kolejnych „sklejonych” ze sobą), a liczba przegród w drugim etapie może zmieniać się między etapami (przez określenie liczby przegród na kilka na przykład tasowanie powodujące działanie).
Po rozpoczęciu wykonywania etapu jego zadania mogą zajmować miejsca na zadania. Liczba równoczesnych przedziałów zadań wynosi numExecutors * ExecutorCores. Na ogół mogą to być zadania z różnych, niezależnych od siebie etapów.
źródło