Jak ustawić pamięć Apache Spark Executor

127

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.memorysię 4gw$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

WillamS
źródło

Odpowiedzi:

185

Ponieważ używasz Sparka w trybie lokalnym, ustawienie spark.executor.memorynie będzie miało żadnego efektu, jak zauważyłeś. Przyczyną tego jest fakt, że element roboczy „żyje” w procesie JVM sterownika, który jest uruchamiany podczas uruchamiania powłoki Spark, a domyślna pamięć używana do tego celu to 512 MB . Możesz to zwiększyć, ustawiając spark.driver.memoryna coś wyższego, na przykład 5g . Możesz to zrobić:

  • ustawienie go w pliku właściwości (domyślnie $SPARK_HOME/conf/spark-defaults.conf),

    spark.driver.memory              5g
    
  • lub dostarczając ustawienia konfiguracyjne w czasie wykonywania

    $ ./bin/spark-shell --driver-memory 5g
    

Zwróć uwagę, że nie można tego osiągnąć ustawiając go w aplikacji, ponieważ jest już wtedy za późno, proces już się rozpoczął z pewną ilością pamięci.

Przyczyną 265,4 MB jest to, że Spark przeznacza spark.storage.memoryFraction * spark.storage.safetyFraction na całkowitą ilość pamięci masowej i domyślnie są to 0,6 i 0,9.

512 MB * 0.6 * 0.9 ~ 265.4 MB

Należy więc pamiętać, że nie cała ilość pamięci sterownika będzie dostępna do przechowywania RDD.

Ale kiedy zaczniesz to uruchamiać w klastrze, spark.executor.memoryustawienie przejmie kontrolę podczas obliczania kwoty przeznaczonej na pamięć podręczną Sparka.

Grega Kešpret
źródło
1
Czy 5G jest równoważne 5Gb?
Chuck
@Chuck spark.apache.org/docs/latest/… "Ilość pamięci do wykorzystania w procesie sterownika, tj. W miejscu inicjalizacji SparkContext, w tym samym formacie co ciągi pamięci JVM z przyrostkiem jednostki rozmiaru (" k "," m "," g "lub" t ") (np. 512m, 2g)."
James Moore
39

Pamiętaj również, że w trybie lokalnym musisz ustawić ilość pamięci sterownika przed uruchomieniem jvm:

bin/spark-submit --driver-memory 2g --class your.class.here app.jar

Spowoduje to uruchomienie maszyny JVM z 2G zamiast domyślnych 512 MB.
Szczegóły tutaj :

W trybie lokalnym masz tylko jeden executor, a ten executor jest twoim sterownikiem, więc musisz zamiast tego ustawić pamięć sterownika. * To powiedziawszy, w trybie lokalnym, zanim uruchomisz spark-submit, maszyna JVM została już uruchomiona z domyślnymi ustawieniami pamięci, więc ustawienie „spark.driver.memory” w pliku conf właściwie nic nie da. Zamiast tego należy uruchomić funkcję spark-submit w następujący sposób

Dmitriy Selivanov
źródło
5

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

bin/spark-shell --master yarn --num-executors 6  --driver-memory 5g --executor-memory 7g

(nie można podbić pamięci modułu wykonawczego do 8g, istnieje pewne ograniczenie konfiguracji przędzy).

Somum
źródło
OP wspomina, że ​​używa jednej maszyny.
Sharique Abdullah
Robisz executor-memorywyższą niż driver-memory?
nimeresam
5

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:

conf=SparkConf()
conf.set("spark.driver.memory", "4g") 

Oto pełny przykład skryptu w Pythonie, którego używam do uruchomienia Sparka:

import os
import sys
import glob

spark_home = '<DIRECTORY WHERE SPARK FILES EXIST>/spark-2.0.0-bin-hadoop2.7/'
driver_home = '<DIRECTORY WHERE DRIVERS EXIST>'

if 'SPARK_HOME' not in os.environ:
    os.environ['SPARK_HOME'] = spark_home 

SPARK_HOME = os.environ['SPARK_HOME']

sys.path.insert(0,os.path.join(SPARK_HOME,"python"))
for lib in glob.glob(os.path.join(SPARK_HOME, "python", "lib", "*.zip")):
    sys.path.insert(0,lib);

from pyspark import SparkContext
from pyspark import SparkConf
from pyspark.sql import SQLContext

conf=SparkConf()
conf.set("spark.executor.memory", "4g")
conf.set("spark.driver.memory", "4g")
conf.set("spark.cores.max", "2")
conf.set("spark.driver.extraClassPath",
    driver_home+'/jdbc/postgresql-9.4-1201-jdbc41.jar:'\
    +driver_home+'/jdbc/clickhouse-jdbc-0.1.52.jar:'\
    +driver_home+'/mongo/mongo-spark-connector_2.11-2.2.3.jar:'\
    +driver_home+'/mongo/mongo-java-driver-3.8.0.jar') 

sc = SparkContext.getOrCreate(conf)

spark = SQLContext(sc)
Sarah
źródło
4

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.

Zrzut ekranu

Po zwiększeniu [ --driver-memory 2G ], pamięć executora wzrosła do ~ 950Mb. wprowadź opis obrazu tutaj

Sanchay
źródło
2

utwórz plik o nazwie spark-env.sh w katalogu spark / conf i dodaj tę linię

SPARK_EXECUTOR_MEMORY=2000m #memory size which you want to allocate for the executor
Mohamed Thasin ah
źródło
1
Dokładnie, uruchamiam mastera z konkretną konfiguracją, nie musiałbym dodawać opcji za każdym razem, gdy uruchamiam polecenie Spark. Ale dotyczy to tylko węzła klastra, na wypadek, gdyby był autonomiczny, ustawienie to SPARK_WORKER_MEMORY.
Evhz
1

Możesz zbudować polecenie, korzystając z następującego przykładu

 spark-submit    --jars /usr/share/java/postgresql-jdbc.jar    --class com.examples.WordCount3  /home/vaquarkhan/spark-scala-maven-project-0.0.1-SNAPSHOT.jar --jar  --num-executors 3 --driver-memory 10g **--executor-memory 10g** --executor-cores 1  --master local --deploy-mode client  --name wordcount3 --conf "spark.app.id=wordcount" 
vaquar khan
źródło
1

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

spar.executor.cores=1

spark.executor.memory=2g

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-submitpolecenia wraz z klasą i ścieżką aplikacji.

Przykład:

spark-submit \

  --class org.apache.spark.examples.SparkPi \

  --master yarn \

  --deploy-mode cluster \  # can be client for client mode

  --executor-memory 2G \

  --num-executors 5 \

  /path/to/examples.jar \

  1000
Radhakrishnan Rk
źródło
0

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.

A. Mishra
źródło
0
spark-submit \

  --class org.apache.spark.examples.SparkPi \

  --master yarn \

  --deploy-mode cluster \  # can be client for client mode

  --executor-memory 2G \

  --num-executors 5 \

  /path/to/examples.jar \

  1000
keven
źródło
0

W systemie Windows lub Linux możesz użyć tego polecenia:

spark-shell --driver-memory 2G

wprowadź opis obrazu tutaj

Robert David Ramírez Garcia
źródło
0

O ile wiem, zmiana spark.executor.memoryat run time nie byłaby możliwa . Jeśli używasz wersji samodzielnej z pyspark i graphframes, możesz uruchomić pyspark REPL, wykonując następujące polecenie:

pyspark --driver-memory 2g --executor-memory 6g --packages graphframes:graphframes:0.7.0-spark2.4-s_2.11

Pamiętaj, aby odpowiednio zmienić SPARK_VERSIONzmienną środowiskową dotyczącą najnowszej wydanej wersji platformy Spark

Taie
źródło