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

Apache spark Spark:java.io.IOException:设备上没有剩余空间,apache-spark,rdd,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-

现在我正在学习如何使用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(...)
在我的节目中,我有很多这样的台词:

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会创建一些新的RDD,在我的程序中Spark创建了太多的RDD,所以我有一个例外,我不确定我的想法是否正确

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


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

根据您提供的
错误消息,您的情况是硬盘上没有磁盘空间。然而,这不是由RDD持久性引起的,而是在调用
reduce
时隐式需要的洗牌


因此,您应该清除驱动器并为tmp文件夹腾出更多空间,这是因为Spark在本地系统的/tmp目录下创建了一些临时shuffle文件。您可以通过在Spark conf文件中设置以下属性来避免此问题

在spark-env.sh中设置此属性

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

export SPARK_JAVA_OPTS

作为补充,要为您洗牌tmp文件指定默认文件夹,您可以将下面的行添加到
$SPARK\u HOME/conf/SPARK defaults.conf


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

我可能是错的,但通常spark会将所有内容都保存在内存中,如果它填满了你的硬盘,你可能没有给他足够的内存。无论如何,你不能删除你“认为”不再使用的RDD。你不应该删除它们。只要计算结果{i+1}需要,结果{i}就会被保留(它仍然可以被存储,但可以被覆盖)。您可能无法存储某个计算中的临时文件。但我不知道为什么我有IOException,它说设备上没有剩余空间…来自Databricks支持论坛的回答可能与此相关:此设置如何避免临时文件磁盘空间问题?同样的问题,此解决方案不适用于我:(