2015-07-16 15 views
9

Próbuję zbudować dzia rekomendacji użyciu Spark i po prostu zabrakło pamięci:Zwiększenie dostępnej pamięci do PySpark przy starcie

Exception in thread "dag-scheduler-event-loop" java.lang.OutOfMemoryError: Java heap space 

Chciałbym zwiększyć ilość pamięci dostępnej dla Spark modyfikując właściwość spark.executor.memory , w PySpark, w czasie wykonywania.

Czy to możliwe? Jeśli tak to jak?

aktualizacja

zainspirowany link użytkownika @ zero323 komentarzu starałem się usunąć i odtworzyć kontekst PySpark:

del sc 
from pyspark import SparkConf, SparkContext 
conf = (SparkConf().setMaster("http://hadoop01.woolford.io:7077").setAppName("recommender").set("spark.executor.memory", "2g")) 
sc = SparkContext(conf = conf) 

powrócił:

ValueError: Cannot run multiple SparkContexts at once; 

to dziwne, od:

>>> sc 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'sc' is not defined 
+0

Co masz na myśli mówiąc "w czasie wykonywania"? Modyfikując istniejący "SparkContext"? – zero323

+0

Tak, dokładnie. Chciałbym zwiększyć ilość pamięci w sesji PySpark. –

+0

W ramach sesji można [zatrzymać istniejący kontekst i utworzyć nowy] (http://stackoverflow.com/a/31402667/1560062) używając określonych ustawień, ale o ile wiem, nie można zmodyfikować istniejącego. – zero323

Odpowiedz

25

Można ustawić spark.executor.memory po uruchomieniu pyspark-shell

pyspark --num-executors 5 --driver-memory 2g --executor-memory 2g 
16

Nie jestem pewien, dlaczego wybrało odpowiedź powyżej, gdy wymaga ponownego uruchomienia powłoki i otwarcie z innego polecenia! Chociaż to działa i jest użyteczne, istnieje rozwiązanie in-line, o które faktycznie chodziło. Jest to w zasadzie to, co @ zer323, o którym mowa w komentarzach powyżej, ale link prowadzi do postu opisującego implementację w Scali. Poniżej znajduje się działająca implementacja specjalnie dla PySpark.

Uwaga: Kontrast SparkContext, dla którego chcesz zmodyfikować ustawienia, nie mógł zostać rozpoczęty lub musisz go zamknąć, zmodyfikować ustawienia i ponownie otworzyć.

from pyspark import SparkContext 
SparkContext.setSystemProperty('spark.executor.memory', '2g') 
sc = SparkContext("local", "App Name") 

źródło: https://spark.apache.org/docs/0.8.1/python-programming-guide.html

PS: jeśli trzeba zamknąć SparkContext wystarczy użyć:

SparkContext.stop(sc) 

i dokładnie sprawdzić bieżące ustawienia, które zostały ustawione można użyć:

sc._conf.getAll() 
4

O ile wiem, to nie byłoby możliwe aby zmienić spark.executor.memory w czasie wykonywania. Kontenery na datanodach zostaną utworzone jeszcze przed zainicjowaniem iskry.

Powiązane problemy