Wie stelle ich die Heap-Größe für Spark ein / erhalte sie (über Python Notebook)?

7

Ich verwende Spark (1.5.1) von einem IPython-Notebook auf einem MacBook Pro. Nach der Installation von Spark und Anaconda starte ich IPython von einem Terminal aus, indem ich Folgendes ausführe : IPYTHON_OPTS="notebook" pyspark. Dies öffnet eine Webseite, auf der alle meine IPython-Notizbücher aufgelistet sind. Ich kann einen von ihnen auswählen und ihn auf einer zweiten Webseite öffnen. SparkContext (sc) ist bereits verfügbar, und mein erster Befehl im Notizbuch lautet help(sc): Er läuft einwandfrei. Das Problem, das ich habe, ist, dass ich einen Java-Heap-Space-Fehler erhalte, den ich nicht beheben kann. Wie kann ich meine aktuelle Java-Heap-Einstellung anzeigen und wie kann ich sie im Kontext meines Setups erhöhen? Die Fehlermeldung, die ich erhalte, lautet wie folgt:

Py4JJavaError: An error occurred while calling z:org.apache.spark.api.python.PythonRDD.collectAndServe.
: org.apache.spark.SparkException: Job aborted due to stage failure: Task 19 in stage 247.0 failed 1 times, most recent failure: Lost task 19.0 in stage 247.0 (TID 953, localhost): java.lang.OutOfMemoryError: Java heap space
Kai
quelle
Wann hast du den Fehler? versuchen was zu tun?
Eliasah
Erstellen Sie eine RDD von LabeledPoint. Es ist nicht besonders groß, 100K Beobachtungen x2K Merkmalsvektor.
Kai

Antworten:

17

Sie können Spark-Speicherlimits programmgesteuert (über die API) verwalten.

Da SparkContext bereits in Ihrem Notebook verfügbar ist:

sc._conf.get('spark.driver.memory')

Sie können auch festlegen, müssen jedoch zuerst den vorhandenen SparkContext herunterfahren:

conf = SparkConf().setAppName("App")
conf = (conf.setMaster('local[*]')
        .set('spark.executor.memory', '4G')
        .set('spark.driver.memory', '45G')
        .set('spark.driver.maxResultSize', '10G'))
sc = SparkContext(conf=conf)

Wenn Ihre Arbeitslast für alle Analysen gleich ist, ist die Bearbeitung der oben genannten spark-defaults.conf der richtige Weg.

noleto
quelle
6

Ich habe es gelöst, indem ich eine spark-defaults.confDatei erstellt apache-spark/1.5.1/libexec/conf/und die folgende Zeile hinzugefügt habe: spark.driver.memory 14g

Das hat mein Problem gelöst. Aber dann bin ich auf eine andere Ausgabe von gestoßen exceeding max result size of 1024MB. Die Lösung bestand darin, eine weitere Zeile in die obige Datei einzufügen: spark.driver.maxResultSize 2g

Kai
quelle
14g ist nicht viel ??? Es ist kein Big Data, aber es ist tatsächlich viel!
Eliasah
Tolle Antwort und die einzige, die für mich funktioniert hat. Vielen Dank.
Francesco Boi
1

Verwenden Sie einfach die configOption, wenn Sie SparkSession einstellen (ab 2.4).

MAX_MEMORY = "5g"

spark = SparkSession \
    .builder \
    .appName("Foo") \
    .config("spark.executor.memory", MAX_MEMORY) \
    .config("spark.driver.memory", MAX_MEMORY) \
    .getOrCreate()
LaSul
quelle
Ich erhalte die Fehlermeldung: Dieser SparkContext ist möglicherweise vorhanden.
Arash
Ersetzen Sie einfach Ihren Code durch diesen, anstatt ihn hinzuzufügen. Die Nachricht sagte, dass Sie bereits eine Sitzung erstellt haben,
LaSul