web-dev-qa-db-ja.com

java.lang.OutOfMemoryError:100バイトのメモリを取得できず、0になりました

次のコマンドを使用して、ローカルモードでSpark 2.0を使用してPysparkを呼び出しています。

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

入力データフレームはtsvファイルから読み取られており、580 K x 28列を持っています。私はデータフレームでいくつかの操作を行っていますが、それをtsvファイルにエクスポートしようとしていますが、このエラーが発生しています。

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

このエラーを取り除く方法のポインター。 dfを簡単に表示したり、行をカウントしたりできます。

出力データフレームは23列の3100行です

エラー:

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:
15
ML_Passion

私にとっての問題は確かにcoalesce()でした。私がしたことは、coalesce()を使用せずに、代わりにdf.write.parquet("testP")を使用して寄せ木張りのファイルをエクスポートすることでした。次に、ファイルを読み戻し、coalesce(1)でエクスポートします。

うまくいけばそれもあなたのために働く。

10
bobo32

この問題の原因は coalesce() であると考えています。これは完全なシャッフルを回避するという事実にもかかわらず( repartition would do )、データを圧縮する必要があります要求されたパーティション数。

ここでは、すべてのデータを1つのパーティションに収めるように要求しているため、1つのタスク(および1つのタスクのみ)がall dataを処理する必要があります。コンテナがメモリの制限を受ける可能性があります。

したがって、この場合は1より多くのパーティションを要求するか、coalesce()を避けてください。


それ以外の場合は、メモリ構成を増やすために、以下のリンクで提供されているソリューションを試すことができます。

  1. Spark Java.lang.OutOfMemoryError:Javaヒープスペース
  2. キーでグループ化するとスパークがメモリ不足になります
12
gsamaras

私の場合、coalesce(1)repartition(1)に置き換えました。

6

他の回答で述べたように、repartition(1)の代わりにcoalesce(1)を使用してください。その理由は、repartition(1)により、アップストリーム処理が1つのエグゼキューターだけでなく、並列(複数のタスク/パーティション)で行われるようになるためです。

Dataset.coalesce() Spark docs:

ただし、抜本的な合体を行っている場合は、たとえばnumPartitions = 1に設定すると、計算が必要なノードよりも少なくなる可能性があります(たとえば、numPartitions = 1の場合は1つのノード)。これを回避するには、代わりにrepartition(1)を呼び出します。これはシャッフルステップを追加しますが、現在のアップストリームパーティションが(現在のパーティションが何であれ)並行して実行されることを意味します。

2
Mark Rajcok

私の場合、ドライバーは労働者よりも小さかった。ドライバーを大きくすることで問題が解決しました。

0
Farshad Javadi