Jak mogę zwiększyć ilość pamięci dostępnej dla węzłów wykonawczych Apache Spark?
Mam plik 2 GB, który nadaje się do załadowania do Apache Spark. W tej chwili używam Apache Spark na 1 maszynie, więc sterownik i executor są na tej samej maszynie. Maszyna posiada 8 GB pamięci.
Kiedy próbuję policzyć linie pliku po ustawieniu pliku do buforowania w pamięci, otrzymuję następujące błędy:
2014-10-25 22:25:12 WARN CacheManager:71 - Not enough space to cache partition rdd_1_1 in memory! Free memory is 278099801 bytes.
Spojrzałem w dokumentacji tutaj i ustawić spark.executor.memory
się 4g
w$SPARK_HOME/conf/spark-defaults.conf
Interfejs użytkownika pokazuje, że ta zmienna jest ustawiona w środowisku Spark. Możesz znaleźć zrzut ekranu tutaj
Jednak kiedy przechodzę do zakładki Executor, limit pamięci dla mojego pojedynczego Executora jest nadal ustawiony na 265,4 MB. Nadal pojawia się ten sam błąd.
Próbowałem różnych rzeczy wymienionych tutaj, ale nadal pojawia się błąd i nie mam jasnego pojęcia, gdzie powinienem zmienić ustawienie.
Uruchamiam swój kod interaktywnie z powłoki Spark
źródło
Pamiętaj również, że w trybie lokalnym musisz ustawić ilość pamięci sterownika przed uruchomieniem jvm:
Spowoduje to uruchomienie maszyny JVM z 2G zamiast domyślnych 512 MB.
Szczegóły tutaj :
źródło
Najwyraźniej pytanie nigdy nie mówi, aby działać w trybie lokalnym, a nie na przędzy. Jakoś nie udało mi się uruchomić zmiany spark-default.conf. Zamiast tego spróbowałem tego i zadziałało
(nie można podbić pamięci modułu wykonawczego do 8g, istnieje pewne ograniczenie konfiguracji przędzy).
źródło
executor-memory
wyższą niżdriver-memory
?Odpowiedź udzielona przez Gregę pomogła mi rozwiązać problem. Uruchamiam Spark lokalnie ze skryptu w języku Python w kontenerze platformy Docker. Początkowo występował błąd braku pamięci Java podczas przetwarzania niektórych danych w Spark. Jednak udało mi się przydzielić więcej pamięci, dodając następujący wiersz do mojego skryptu:
Oto pełny przykład skryptu w Pythonie, którego używam do uruchomienia Sparka:
źródło
Musisz zwiększyć pamięć sterownika. Na Macu (tzn. Gdy działa na lokalnym urządzeniu głównym), domyślna pamięć sterownika to 1024M). Domyślnie do modułu wykonawczego przydzielane jest zatem 380 MB.
Po zwiększeniu [ --driver-memory 2G ], pamięć executora wzrosła do ~ 950Mb.
źródło
utwórz plik o nazwie spark-env.sh w katalogu spark / conf i dodaj tę linię
źródło
SPARK_WORKER_MEMORY
.Możesz zbudować polecenie, korzystając z następującego przykładu
źródło
Pamięć modułu wykonawczego Spark jest wymagana do uruchamiania zadań Spark na podstawie instrukcji podanych przez program sterownika. Zasadniczo wymaga to więcej zasobów, które zależą od przesłanej pracy.
Pamięć modułu wykonawczego obejmuje pamięć wymaganą do wykonywania zadań oraz pamięć narzutów, która nie powinna być większa niż rozmiar maszyny JVM i maksymalny rozmiar kontenera przędzy.
Dodaj następujące parametry w pliku spark-defaults.conf
Jeśli używasz jakichkolwiek narzędzi do zarządzania klastrem, takich jak Cloudera Manager lub Amabari, odśwież konfigurację klastra, aby odzwierciedlić najnowsze konfiguracje dla wszystkich węzłów w klastrze.
Alternatywnie możemy przekazać rdzeń wykonawcy i wartość pamięci jako argument podczas wykonywania
spark-submit
polecenia wraz z klasą i ścieżką aplikacji.Przykład:
źródło
wspomniałeś, że uruchamiasz swój kod interaktywnie w powłoce Spark, więc podczas wykonywania czynności, jeśli nie ustawiono odpowiedniej wartości dla pamięci sterownika lub modułu wykonawczego, Spark domyślnie przypisuje do niego jakąś wartość, która jest oparta na pliku właściwości (gdzie wartość domyślna to wspomniano).
Mam nadzieję, że zdajesz sobie sprawę z tego, że istnieje jeden sterownik (węzeł główny) i węzeł roboczy (w którym tworzone i przetwarzane są executory), więc program Spark wymaga w zasadzie dwóch typów przestrzeni, więc jeśli chcesz ustawić pamięć sterownika, a następnie po uruchomieniu powłoki zapłonowej.
spark-shell --driver-memory "twoja wartość" i aby ustawić pamięć executora: spark-shell --executor-memory "twoja wartość"
wtedy myślę, że dobrze jest wybrać pożądaną wartość pamięci, której chcesz używać w swojej iskierce.
źródło
źródło
W systemie Windows lub Linux możesz użyć tego polecenia:
źródło
O ile wiem, zmiana
spark.executor.memory
at run time nie byłaby możliwa . Jeśli używasz wersji samodzielnej z pyspark i graphframes, możesz uruchomić pysparkREPL
, wykonując następujące polecenie:Pamiętaj, aby odpowiednio zmienić
SPARK_VERSION
zmienną środowiskową dotyczącą najnowszej wydanej wersji platformy Sparkźródło