现在我正在学习如何使用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(),它不起作用。
答案 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