次のコマンドを使用して、ローカルモードで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:
私にとっての問題は確かにcoalesce()
でした。私がしたことは、coalesce()
を使用せずに、代わりにdf.write.parquet("testP")
を使用して寄せ木張りのファイルをエクスポートすることでした。次に、ファイルを読み戻し、coalesce(1)
でエクスポートします。
うまくいけばそれもあなたのために働く。
この問題の原因は coalesce() であると考えています。これは完全なシャッフルを回避するという事実にもかかわらず( repartition would do )、データを圧縮する必要があります要求されたパーティション数。
ここでは、すべてのデータを1つのパーティションに収めるように要求しているため、1つのタスク(および1つのタスクのみ)がall dataを処理する必要があります。コンテナがメモリの制限を受ける可能性があります。
したがって、この場合は1より多くのパーティションを要求するか、coalesce()
を避けてください。
それ以外の場合は、メモリ構成を増やすために、以下のリンクで提供されているソリューションを試すことができます。
私の場合、coalesce(1)
をrepartition(1)
に置き換えました。
他の回答で述べたように、repartition(1)
の代わりにcoalesce(1)
を使用してください。その理由は、repartition(1)により、アップストリーム処理が1つのエグゼキューターだけでなく、並列(複数のタスク/パーティション)で行われるようになるためです。
Dataset.coalesce() Spark docs:
ただし、抜本的な合体を行っている場合は、たとえばnumPartitions = 1に設定すると、計算が必要なノードよりも少なくなる可能性があります(たとえば、numPartitions = 1の場合は1つのノード)。これを回避するには、代わりにrepartition(1)を呼び出します。これはシャッフルステップを追加しますが、現在のアップストリームパーティションが(現在のパーティションが何であれ)並行して実行されることを意味します。
私の場合、ドライバーは労働者よりも小さかった。ドライバーを大きくすることで問題が解決しました。