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