2015-06-25 9 views
22

Ich benutze Spark 1.4 für meine Forschung und kämpfen mit den Speichereinstellungen. Meine Maschine hat 16 GB Arbeitsspeicher, also kein Problem da die Größe meiner Datei nur 300 MB beträgt. Obwohl, wenn ich versuche, Spark-RDD zu Panda Datenrahmen zu konvertieren mit toPandas() Funktion ich die folgende Fehlermeldung:Spark 1.4 Erhöhung maxResultSize Speicher

serialized results of 9 tasks (1096.9 MB) is bigger than spark.driver.maxResultSize (1024.0 MB) 

Ich habe versucht, dieses Problem beheben den Funken-config-Datei zu ändern und immer noch die gleichen Fehler. Ich habe gehört, dass dies ein Problem mit Funken 1.4 ist und frage mich, ob Sie wissen, wie Sie das lösen können. Jede Hilfe wird sehr geschätzt.

Antwort

32

Sie spark.driver.maxResultSize Parameter im SparkConf Objekt 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 eine neue SQLContext auch erstellen:

from pyspark.sql import SQLContext 
sqlContext = SQLContext(sc) 
4

Sieht aus wie Sie die RDD sammeln, so wird es auf jeden Fall Sammeln Sie alle Daten zum Treiberknoten, deshalb sind Sie mit diesem Problem konfrontiert. Sie müssen vermeiden, Daten zu sammeln, wenn nicht für eine RDD erforderlich, oder wenn es notwendig ist, dann geben Sie spark.driver.maxResultSize. gibt es zwei Möglichkeiten

1 - create Spark Config by setting this variable as
conf.set("spark.driver.maxResultSize", "3g")
2 - or set this variable in spark-defaults.conf file present in conf folder of spark. like spark.driver.maxResultSize 3g and restart the spark.

+0

ich die Variable in der Konfigurationsdatei habe gesetzt zu entfernen und die Funken neu gestartet, aber immer noch die gleichen Fehler. – ahajib

+0

Haben Sie die erste Lösung ausprobiert? –

+0

Es funktionierte für mich, aber das sollte eine vorübergehende Lösung sein wie du erwähnt;) danke irgendeinen Weg –

14

in der Befehlszeile diese Variable zu definieren, wie mit pyspark kann --conf spark.driver.maxResultSize=3g auch die maximale Ergebnisgröße zu erhöhen, verwendet werden.

5

Tuning spark.driver.maxResultSize ist eine gute Übung in Anbetracht der Laufumgebung. Es ist jedoch nicht die Lösung für Ihr Problem, da sich die Datenmenge von Zeit zu Zeit ändern kann. Wie @ Zia-Kayani erwähnt, ist es besser, Daten mit Bedacht zu sammeln. Wenn Sie also einen DataFrame df haben, können Sie df.rdd anrufen und alle magischen Dinge auf dem Cluster tun, nicht im Treiber. Wenn Sie jedoch die Daten sammeln möchten, würde ich vorschlagen:

  • Schalten Sie nicht spark.sql.parquet.binaryAsString. String-Objekte benötigen mehr Platz
  • Verwenden Sie spark.rdd.compress, um RDDs zu komprimieren, wenn Sie sie sammeln
  • Versuchen Sie, es mithilfe der Seitenumbruch zu sammeln. (Code in Scala, von einer anderen Antwort Scala: How to get a range of rows in a dataframe)

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

1

Es gibt auch einen Funken Fehler https://issues.apache.org/jira/browse/SPARK-12837 , die den gleichen Fehler

serialized results of X tasks (Y MB) is bigger than spark.driver.maxResultSize 

noch gibt, obwohl Sie keine Daten an den Fahrer ziehen können ausdrücklich.

SPARK-12837 adressiert einen Spark-Fehler, der Akkumulatoren/Broadcast-Variablen vor Spark 2 wurden zum Treiber unnötige verursacht dieses Problem verursacht.

0

während der Arbeit oder Terminal starten, können Sie

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

verwenden, um den Engpass

Verwandte Themen