Ich habe mit diesen Einstellungen (ua) einen Spark-Job gestartet:
%Vor% Ich habe meinen pyspark
-Auftrag debuggt, und er hat mir immer den Fehler mitgeteilt:
Also habe ich die spark.driver.maxResultSize
auf 18 G
in den Konfigurationseinstellungen erhöht. Und es hat funktioniert !!
Nun, das ist interessant, weil in beiden Fällen spark.driver.memory
KLEINER war als die zurückgegebenen serialisierten Ergebnisse.
Warum ist das erlaubt? Ich würde annehmen, dass dies nicht möglich ist, weil die serialisierten Ergebnisse 17.4 GB
waren, als ich debugging, das ist mehr als die Größe des Treibers, der 12 GB
ist, wie oben gezeigt?
Wie ist das möglich?
Mein Verständnis ist, dass wenn wir Spark bitten, eine Aktion auszuführen, die Ergebnisse von allen Partitionen serialisiert werden, aber diese Ergebnisse müssen nicht an den Treiber gesendet werden, es sei denn, ein Vorgang wie collect()
wird ausgeführt.
spark.driver.maxResultSize
definiert ein Limit für die Gesamtgröße der serialisierten Ergebnisse aller Partitionen & amp; ist unabhängig von der tatsächlichen spark.driver.memory
. Daher könnte Ihr spark.driver.memory
kleiner sein als Ihr spark.driver.maxResultSize
und Ihr Code würde immer noch funktionieren.
Wir könnten wahrscheinlich eine bessere Idee bekommen, wenn Sie uns die Transformationen und Aktionen mitteilen, die in diesem Prozess oder Ihrem Code-Snippet verwendet werden.
Dies ist möglich, weil spark.driver.memory
den JVM-Treiberprozess nicht Python-Interpreter konfiguriert und Daten zwischen ihnen mit Sockets übertragen werden und der Treiberprozess nicht alle Daten im Speicher behalten muss (nicht in lokale Struktur konvertieren).
Tags und Links jvm apache-spark pyspark cluster-computing buffer