J'utilise Spark 1.4 pour mes recherches et je lutte avec les paramètres de mémoire. Ma machine a 16 Go de mémoire, donc pas de problème, car la taille de mon fichier n’est que de 300 Mo. Bien que, lorsque j'essaie de convertir Spark RDD en panda dataframe en utilisant la fonction toPandas()
, le message d'erreur suivant s'affiche:
serialized results of 9 tasks (1096.9 MB) is bigger than spark.driver.maxResultSize (1024.0 MB)
J'ai essayé de résoudre ce problème en modifiant le fichier spark-config et en obtenant toujours la même erreur. J'ai entendu dire qu'il s'agissait d'un problème avec l'étincelle 1.4 et que je me demandais si vous savez comment résoudre ce problème. Toute aide est très appréciée.
Vous pouvez définir le paramètre spark.driver.maxResultSize
dans l'objet SparkConf
:
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)
Vous devriez probablement aussi créer une nouvelle SQLContext
:
from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)
À partir de la ligne de commande, comme avec pyspark, --conf spark.driver.maxResultSize=3g
peut également être utilisé pour augmenter la taille maximale du résultat.
Régler spark.driver.maxResultSize
est une bonne pratique compte tenu de l'environnement en cours d'exécution. Cependant, ce n'est pas la solution à votre problème car la quantité de données peut changer au fil du temps. Comme @ Zia-Kayani l'a mentionné, il est préférable de collecter les données judicieusement. Ainsi, si vous avez une variable __ DataFrame df
, vous pouvez appeler df.rdd
et effectuer toutes les tâches magiques sur le cluster, pas dans le pilote. Toutefois, si vous devez collecter les données, je vous suggérerais:
spark.sql.parquet.binaryAsString
. Les objets string prennent plus de placespark.rdd.compress
pour compresser les RDD lorsque vous les collectez
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; }
lors du démarrage du travail ou du terminal, vous pouvez utiliser
--conf spark.driver.maxResultSize="0"
enlever le goulot d'étranglement
Il existe également un bogue Spark https://issues.Apache.org/jira/browse/SPARK-12837 Qui donne la même erreur
serialized results of X tasks (Y MB) is bigger than spark.driver.maxResultSize
même si vous ne pouvez pas extraire explicitement les données du pilote.
SPARK-12837 corrige un bogue Spark selon lequel les accumulateurs/variables de diffusion antérieures à Spark 2 ont été attirés par le pilote inutile, ce qui a provoqué ce problème.
Vous pouvez définir spark.driver.maxResultSize sur 2 Go lorsque vous démarrez le shell pyspark:
pyspark --conf "spark.driver.maxResultSize=2g"
C'est pour permettre 2Go pour spark.driver.maxResultSize