webentwicklung-frage-antwort-db.com.de

Spark 1.4 erhöht den maxResultSize-Speicher

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.

25
ahajib

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)
38
zero323

In der Befehlszeile, beispielsweise mit pyspark, kann --conf spark.driver.maxResultSize=3g auch verwendet werden, um die maximale Ergebnisgröße zu erhöhen.

20
Dolan Antenucci

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 Platz
  • Verwenden Sie spark.rdd.compress, um RDDs zu komprimieren, wenn Sie sie sammeln
  • Versuchen Sie es mit Paginierung zu sammeln. (Code in Scala, aus einer anderen Antwort Scala: So erhalten Sie einen Zeilenbereich in einem Datenrahmen )

    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; }

7
Iraj Hedayati

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 Datei spark-defaults.conf Im Ordner conf von spark. wie spark.driver.maxResultSize 3g und starte den Funken neu.

7
Zia Kayani

beim Starten des Jobs oder Terminals können Sie verwenden 

--conf spark.driver.maxResultSize="0"

den Engpass entfernen

2
Mike

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.

2
Tagar

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

0
korahtm