2015-07-16 8 views
9

Ich versuche, einen Recommender mit Funken zu bauen und lief nur aus der Erinnerung:erhöhen Speicher zur Verfügung zu PySpark zur Laufzeit

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

Ich mag den Speicher zur Verfügung, um Funken zu erhöhen, indem die spark.executor.memory Eigenschaften modifizierenden , in PySpark, zur Laufzeit.

Ist das möglich? Wenn das so ist, wie?

Update

durch den Link inspiriert in @ zero323 Kommentar habe ich versucht, den Kontext, in PySpark zu löschen und neu erstellen:

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) 

zurückgegeben:

ValueError: Cannot run multiple SparkContexts at once; 

Das ist seltsam, seit:

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

Was meinst du mit "zur Laufzeit"? Durch Ändern des vorhandenen 'SparkContext'? – zero323

+0

Ja, genau. Ich möchte die Speicherkapazität in der PySpark-Sitzung erhöhen. –

+0

Innerhalb der Sitzung [stoppe den bestehenden Kontext und erstelle einen neuen] (http://stackoverflow.com/a/31402667/1560062) unter Verwendung bestimmter Einstellungen, aber soweit ich weiß, kannst du einen bestehenden nicht ändern. – zero323

Antwort

25

Sie könnten spark.executor.memory gesetzt, wenn Sie beginnen, Ihre pyspark-shell

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

Ich bin mir nicht sicher, warum Sie die Antwort oben ausgewählt haben, wenn es erfordert Shell und Öffnen mit einem anderen Befehl Neustart! Obwohl das funktioniert und nützlich ist, gibt es eine Inline-Lösung, die tatsächlich angefordert wurde. Dies ist im Wesentlichen was @ Zero323 in den obigen Kommentaren referenziert, aber der Link führt zu einem Post, der die Implementierung in Scala beschreibt. Unten ist eine funktionierende Implementierung speziell für PySpark.

Hinweis: Die SparkContext Sie wollen, müssen Sie die Einstellungen ändern, nicht gestartet wurden oder sonst werden Sie es schließen müssen, Einstellungen ändern und wieder zu öffnen.

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

Quelle: https://spark.apache.org/docs/0.8.1/python-programming-guide.html

P. S. wenn Sie die SparkContext nur schließen, müssen verwenden:

SparkContext.stop(sc) 

und verdoppeln die aktuellen Einstellungen überprüfen, die festgelegt wurden, können Sie verwenden:

sc._conf.getAll() 
4

Soweit ich es weiß, wäre nicht möglich, Ändern der spark.executor.memory zur Laufzeit. Die Container auf den Datenknoten werden noch vor dem Initialisieren des Spark-Kontexts erstellt.