火花:java.io.ioexception:设备上没有剩余的空间



现在,我正在学习如何使用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(...)

(对此感到抱歉,因为代码是许多要在那里写的)

所以我认为当我这样做时,请创建一些新的RDD,在我的程序中,Spark创建了太多的RDD,所以我有例外。我不确定我认为是否正确。

如何删除我不会再使用的RDD?喜欢结果1和result2?

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

这是因为Spark在您本地系统的/tmp目录下创建一些临时混乱文件。

spark-env.sh中设置以下属性。
(将目录相应地更改为基础上的任何目录,其中包含了权限,并在其中有足够的空间)

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

您还可以设置spark.local.dir中的$SPARK_HOME/conf/spark-defaults.conf属性,如@eugene所述

根据您提供的Error message,您的情况不留在硬盘上。但是,它不是由RDD持久性引起的,而是您在调用reduce时隐含需要的混音。

因此,您应该清除驱动器,并为TMP文件夹提供更多空间

作为补充,要指定Shuffle TMP文件的默认文件夹,您可以将下面的行添加到$SPARK_HOME/conf/spark-defaults.conf

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