Spark:java.io.IOException:设备上没有剩余空间

时间:2015-05-11 08:26:54

标签: apache-spark rdd

现在我正在学习如何使用spark。我有一段可以反转矩阵的代码,当矩阵的阶数小到100时它就可以工作。但是当矩阵的阶数大到2000时,我有像这样的例外:

15/05/10 20:31:00 ERROR DiskBlockObjectWriter: Uncaught exception while reverting partial writes to file /tmp/spark-local-20150510200122-effa/28/temp_shuffle_6ba230c3-afed-489b-87aa-91c046cadb22

java.io.IOException: No space left on device

在我的程序中,我有很多这样的行:

val result1=matrix.map(...).reduce(...)
val result2=result1.map(...).reduce(...)
val result3=matrix.map(...)

(对不起,因为代码是很多人写的)

所以我觉得当我这样做时,Spark会创建一些新的rdds,并且在我的程序中Spark会创建太多rdds所以我有例外。我不确定我认为是否正确。

如何删除不再使用的rdds?比如result1和result2?

我试过rdd.unpersist(),它不起作用。

3 个答案:

答案 0 :(得分:10)

这是因为Spark在本地系统的/ tmp目录下创建了一些临时shuffle文件。您可以通过在spark conf文件中设置以下属性来避免此问题。

在spark-evn.sh中设置此属性。

SPARK_JAVA_OPTS+=" -Dspark.local.dir=/mnt/spark,/mnt2/spark -Dhadoop.tmp.dir=/mnt/ephemeral-hdfs"

export SPARK_JAVA_OPTS

答案 1 :(得分:2)

根据您提供的Error message,您的情况是硬盘驱动器上没有剩余磁盘空间。但是,它不是由RDD持久性引起的,而是在调用reduce时隐式需要的随机播放。

因此,您应该清除驱动器并为tmp文件夹腾出更多空间

答案 2 :(得分:0)

作为补充,要为随机播放tmp文件指定默认文件夹,可以将以下行添加到$SPARK_HOME/conf/spark-defaults.conf

spark.local.dir /mnt/nvme/local-dir,/mnt/nvme/local-dir2