引发“ java.io.IOException:设备上没有剩余空间”

时间:2018-07-05 09:25:29

标签: pyspark apache-spark-sql

我在有2个工作人员的ec2集群上运行pyspark作业。 我收到此错误:

2018-07-05 08:20:44 WARN  TaskSetManager:66 - Lost task 1923.0 in stage 18.0 (TID 21385, 10.0.5.97, executor 3): java.io.IOException: No space left on device
at java.io.FileOutputStream.writeBytes(Native Method)
at java.io.FileOutputStream.write(FileOutputStream.java:326)
at org.apache.spark.storage.TimeTrackingOutputStream.write(TimeTrackingOutputStream.java:58)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
at net.jpountz.lz4.LZ4BlockOutputStream.finish(LZ4BlockOutputStream.java:260)
at net.jpountz.lz4.LZ4BlockOutputStream.close(LZ4BlockOutputStream.java:190)
at org.apache.spark.serializer.DummySerializerInstance$1.close(DummySerializerInstance.java:65)
at org.apache.spark.storage.DiskBlockObjectWriter.commitAndGet(DiskBlockObjectWriter.scala:173)
at org.apache.spark.shuffle.sort.ShuffleExternalSorter.writeSortedFile(ShuffleExternalSorter.java:194)
at org.apache.spark.shuffle.sort.ShuffleExternalSorter.closeAndGetSpills(ShuffleExternalSorter.java:416)
at org.apache.spark.shuffle.sort.UnsafeShuffleWriter.closeAndWriteOutput(UnsafeShuffleWriter.java:230)
at org.apache.spark.shuffle.sort.UnsafeShuffleWriter.write(UnsafeShuffleWriter.java:190)
at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:96)
at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:53)
at org.apache.spark.scheduler.Task.run(Task.scala:109)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:345)
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:748)

我看着https://forums.databricks.com/questions/277/how-do-i-avoid-the-no-space-left-on-device-error.html

试图增加随机播放分区-同样的问题。 我的数据在执行者之间看起来相当均匀。 我想尝试为数据帧分配Null或None的解决方法,问题是它是否确实会删除中间的shuffle文件,以及是否保留行号。

例如,如果我的代码如下:

df1 = sqlContext.read.parquet(...)
df2= df1.filter()
df3 = df2.groupBy(*groupList).agg(....)

然后我会放

df1 = Null

像1一样-它会节省随机播放空间吗,不是必需的,它将重新计算df2,df3吗?

第二个问题- 检查点df1或df2是否会破坏行列线?

当处理比我的存储更大的数据(处理了大约400GB的原始数据)时,什么是可行的解决方案

更新 在需要此数据帧的两个阶段之间删除数据帧的缓存有所帮助,我没有遇到任何错误。 我不知道它如何帮助中间洗牌文件。

1 个答案:

答案 0 :(得分:0)

我确实遇到过类似的情况。原因是在使用group by操作时,joins数据将被重新整理。由于此shuffle数据是在Spark应用程序中执行时的临时数据,因此将存储在spark.local.dir文件中的spark-defaults.conf指向的目录中,该目录通常是一个tmp目录用更少的空间。

通常为避免spark-defaults.conf文件中的此错误,将spark.local.dir更新到具有更多内存的位置。