web-dev-qa-db-fra.com

Spark 1.4 augmente la mémoire maxResultSize

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.

25
ahajib

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

À 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.

20
Dolan Antenucci

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:

  • Ne pas activer spark.sql.parquet.binaryAsString. Les objets string prennent plus de place
  • Utilisez spark.rdd.compress pour compresser les RDD lorsque vous les collectez
  • Essayez de le collecter en utilisant la pagination. (code dans Scala, à partir d'une autre réponse Scala: Comment obtenir une plage de lignes dans un cadre de données )

    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

lors du démarrage du travail ou du terminal, vous pouvez utiliser 

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

enlever le goulot d'étranglement

2
Mike

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.

2
Tagar

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

0
korahtm