Ich verwende Spark 1.4 für meine Nachforschungen und kämpfe mit den Speichereinstellungen. Mein Computer hat 16 GB Arbeitsspeicher, also kein Problem, da meine Datei nur 300 MB groß ist. Wenn ich versuche, Spark RDD mithilfe der Funktion toPandas()
in einen Panda-Datenrahmen zu konvertieren, erhalte ich die folgende Fehlermeldung:
serialized results of 9 tasks (1096.9 MB) is bigger than spark.driver.maxResultSize (1024.0 MB)
Ich habe versucht, das zu ändern, indem ich die spark-config-Datei ändere und immer noch den gleichen Fehler bekomme. Ich habe gehört, dass dies ein Problem mit Spark 1.4 ist und mich wundern, wenn Sie wissen, wie Sie dieses Problem lösen können. Jede Hilfe wird sehr geschätzt.
Sie können den Parameter spark.driver.maxResultSize
im Objekt SparkConf
einstellen:
from pyspark import SparkConf, SparkContext
# In Jupyter you have to stop the current context first
sc.stop()
# Create new config
conf = (SparkConf()
.set("spark.driver.maxResultSize", "2g"))
# Create new context
sc = SparkContext(conf=conf)
Sie sollten wahrscheinlich auch eine neue SQLContext
erstellen:
from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)
In der Befehlszeile, beispielsweise mit pyspark, kann --conf spark.driver.maxResultSize=3g
auch verwendet werden, um die maximale Ergebnisgröße zu erhöhen.
Das Einstellen von spark.driver.maxResultSize
ist in Anbetracht der laufenden Umgebung eine gute Praxis. Es ist jedoch keine Lösung für Ihr Problem, da sich die Datenmenge von Zeit zu Zeit ändern kann. Wie von Zia-Kayani erwähnt, ist es besser, Daten klug zu erfassen. Wenn Sie also einen DataFrame df
haben, können Sie df.rdd
aufrufen und alle magischen Dinge im Cluster ausführen, nicht im Treiber. Wenn Sie die Daten jedoch sammeln müssen, würde ich Folgendes vorschlagen:
spark.sql.parquet.binaryAsString
nicht einschalten. String-Objekte benötigen mehr Platzspark.rdd.compress
, um RDDs zu komprimieren, wenn Sie sie sammeln
long count = df.count() int limit = 50; while(count > 0){ df1 = df.limit(limit); df1.show(); //will print 50, next 50, etc rows df = df.except(df1); count = count - limit; }
Sieht so aus, als würden Sie die RDD sammeln. Daher werden auf jeden Fall alle Daten für den Treiberknoten erfasst, weshalb Sie mit diesem Problem konfrontiert sind. Sie müssen vermeiden, Daten zu sammeln, wenn dies für eine Festplatte nicht erforderlich ist, oder wenn dies erforderlich ist, geben Sie spark.driver.maxResultSize
An. Es gibt zwei Möglichkeiten, diese Variable zu definieren
1 - Erstellen Sie Spark Config, indem Sie diese Variable als festlegen
conf.set("spark.driver.maxResultSize", "3g")
2 - oder setzen Sie diese Variable in die Dateispark-defaults.conf
Im Ordner conf von spark. wiespark.driver.maxResultSize 3g
und starte den Funken neu.
beim Starten des Jobs oder Terminals können Sie verwenden
--conf spark.driver.maxResultSize="0"
den Engpass entfernen
Es gibt auch einen Spark-Fehler https://issues.Apache.org/jira/browse/SPARK-12837 , Der denselben Fehler ausgibt
serialized results of X tasks (Y MB) is bigger than spark.driver.maxResultSize
auch wenn Sie Daten möglicherweise nicht explizit zum Treiber ziehen.
SPARK-12837 behebt einen Spark-Fehler, der dazu geführt hat, dass Akkumulatoren/Broadcast-Variablen vor Spark 2 unnötig vom Treiber abgezogen wurden.
Sie können spark.driver.maxResultSize auf 2 GB setzen, wenn Sie die Pyspark-Shell starten:
pyspark --conf "spark.driver.maxResultSize=2g"
Hiermit werden 2 GB für spark.driver.maxResultSize zugelassen