web-dev-qa-db-fra.com

java.lang.OutOfMemoryError: impossible d'acquérir 100 octets de mémoire, obtenu

J'appelle Pyspark avec Spark 2.0 en mode local avec la commande suivante:

pyspark --executor-memory 4g --driver-memory 4g

La trame de données en entrée est lue dans un fichier tsv et compte 580 K x 28 colonnes. Je suis en train de faire quelques opérations sur la base de données, puis j'essaie de l'exporter dans un fichier tsv et j'obtiens cette erreur.

df.coalesce(1).write.save("sample.tsv",format = "csv",header = 'true', delimiter = '\t')

Tous les indicateurs pour se débarrasser de cette erreur. Je peux facilement afficher le df ou compter les lignes.

La trame de données en sortie comporte 3100 lignes avec 23 colonnes.

Erreur:

Job aborted due to stage failure: Task 0 in stage 70.0 failed 1 times, most recent failure: Lost task 0.0 in stage 70.0 (TID 1073, localhost): org.Apache.spark.SparkException: Task failed while writing rows
    at org.Apache.spark.sql.execution.datasources.DefaultWriterContainer.writeRows(WriterContainer.scala:261)
    at org.Apache.spark.sql.execution.datasources.InsertIntoHadoopFsRelationCommand$$anonfun$run$1$$anonfun$apply$mcV$sp$1.apply(InsertIntoHadoopFsRelationCommand.scala:143)
    at org.Apache.spark.sql.execution.datasources.InsertIntoHadoopFsRelationCommand$$anonfun$run$1$$anonfun$apply$mcV$sp$1.apply(InsertIntoHadoopFsRelationCommand.scala:143)
    at org.Apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:70)
    at org.Apache.spark.scheduler.Task.run(Task.scala:85)
    at org.Apache.spark.executor.Executor$TaskRunner.run(Executor.scala:274)
    at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1142)
    at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:617)
    at Java.lang.Thread.run(Thread.Java:745)
Caused by: Java.lang.OutOfMemoryError: Unable to acquire 100 bytes of memory, got 0
    at org.Apache.spark.memory.MemoryConsumer.allocatePage(MemoryConsumer.Java:129)
    at org.Apache.spark.util.collection.unsafe.sort.UnsafeExternalSorter.acquireNewPageIfNecessary(UnsafeExternalSorter.Java:374)
    at org.Apache.spark.util.collection.unsafe.sort.UnsafeExternalSorter.insertRecord(UnsafeExternalSorter.Java:396)
    at org.Apache.spark.sql.execution.UnsafeExternalRowSorter.insertRow(UnsafeExternalRowSorter.Java:94)
    at org.Apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIterator.sort_addToSorter$(Unknown Source)
    at org.Apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIterator.processNext(Unknown Source)
    at org.Apache.spark.sql.execution.BufferedRowIterator.hasNext(BufferedRowIterator.Java:43)
    at org.Apache.spark.sql.execution.WholeStageCodegenExec$$anonfun$8$$anon$1.hasNext(WholeStageCodegenExec.scala:370)
    at org.Apache.spark.sql.execution.WindowExec$$anonfun$15$$anon$1.fetchNextRow(WindowExec.scala:300)
    at org.Apache.spark.sql.execution.WindowExec$$anonfun$15$$anon$1.<init>(WindowExec.scala:309)
    at org.Apache.spark.sql.execution.WindowExec$$anonfun$15.apply(WindowExec.scala:289)
    at org.Apache.spark.sql.execution.WindowExec$$anonfun$15.apply(WindowExec.scala:288)
    at org.Apache.spark.rdd.RDD$$anonfun$mapPartitions$1$$anonfun$apply$23.apply(RDD.scala:766)
    at org.Apache.spark.rdd.RDD$$anonfun$mapPartitions$1$$anonfun$apply$23.apply(RDD.scala:766)
    at org.Apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38)
    at org.Apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:319)
    at org.Apache.spark.rdd.RDD.iterator(RDD.scala:283)
    at org.Apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38)
    at org.Apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:319)
    at org.Apache.spark.rdd.RDD.iterator(RDD.scala:283)
    at org.Apache.spark.rdd.ZippedPartitionsRDD2.compute(ZippedPartitionsRDD.scala:89)
    at org.Apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:319)
    at org.Apache.spark.rdd.RDD.iterator(RDD.scala:283)
    at org.Apache.spark.rdd.ZippedPartitionsRDD2.compute(ZippedPartitionsRDD.scala:89)
    at org.Apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:319)
    at org.Apache.spark.rdd.RDD.iterator(RDD.scala:283)
    at org.Apache.spark.rdd.ZippedPartitionsRDD2.compute(ZippedPartitionsRDD.scala:89)
    at org.Apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:319)
    at org.Apache.spark.rdd.RDD.iterator(RDD.scala:283)
    at org.Apache.spark.rdd.CoalescedRDD$$anonfun$compute$1.apply(CoalescedRDD.scala:96)
    at org.Apache.spark.rdd.CoalescedRDD$$anonfun$compute$1.apply(CoalescedRDD.scala:95)
    at scala.collection.Iterator$$anon$12.nextCur(Iterator.scala:434)
    at scala.collection.Iterator$$anon$12.hasNext(Iterator.scala:440)
    at org.Apache.spark.sql.execution.datasources.DefaultWriterContainer$$anonfun$writeRows$1.apply$mcV$sp(WriterContainer.scala:253)
    at org.Apache.spark.sql.execution.datasources.DefaultWriterContainer$$anonfun$writeRows$1.apply(WriterContainer.scala:252)
    at org.Apache.spark.sql.execution.datasources.DefaultWriterContainer$$anonfun$writeRows$1.apply(WriterContainer.scala:252)
    at org.Apache.spark.util.Utils$.tryWithSafeFinallyAndFailureCallbacks(Utils.scala:1325)
    at org.Apache.spark.sql.execution.datasources.DefaultWriterContainer.writeRows(WriterContainer.scala:258)
    ... 8 more

Driver stacktrace:
7
ML_Passion

Le problème pour moi était en effet coalesce(). J'ai exporté le fichier sans utiliser coalesce() mais parquet en utilisant plutôt df.write.parquet("testP"). Relisez ensuite le fichier et exportez-le avec coalesce(1).

Espérons que cela fonctionne pour vous aussi.

9
bobo32

Je crois que la cause de ce problème est coalesce () , qui malgré le fait qu’il évite un mélange aléatoire (comme la répartition serait le cas }), il doit réduire les données dans le nombre de partitions demandé.

Ici, vous demandez que toutes les données s’intègrent dans une partition. Ainsi, une tâche (et une seule tâche) doit fonctionner avec toutes les données , ce qui peut entraîner des limitations de mémoire pour le conteneur.

Donc, soit demander plus de partitions que 1, soit éviter coalesce() dans ce cas.


Sinon, vous pouvez essayer les solutions fournies dans les liens ci-dessous pour augmenter vos configurations de mémoire:

  1. (Spark Java.lang.OutOfMemoryError: espace de segment de mémoire Java)
  2. _ { Spark manque de mémoire lors du regroupement par clé } _
10
gsamaras

Dans mon cas, remplacer la coalesce(1) par la repartition(1) a fonctionné.

3
Ganesh Dogiparthi

Dans mon cas, le conducteur était plus petit que les travailleurs. Le problème a été résolu en rendant le pilote plus gros. 

0
Farshad Javadi