Spark:java.io.IOException:设备上没有 space

Spark: java.io.IOException: No space left on device

现在我正在学习如何使用 spark.I 有一段代码可以反转矩阵,当矩阵的阶数很小时它可以工作,比如 100.But 当矩阵的阶数像 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,所以我 exception.I 不确定我的想法是否正确。

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

我试过rdd.unpersist(),没用

根据您提供的Error message,您的情况是您的硬盘space没有剩余磁盘。但是,这不是由 RDD 持久性引起的,而是调用 reduce.

时隐式要求的 shuffle

因此,您应该清除驱动器并为您的 tmp 文件夹制作更多 spaces

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

spark-env.sh 中设置以下属性。
(将目录相应地更改为您的基础设施中的任何目录,该目录设置了写权限并且其中有足够的 space)

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

export SPARK_JAVA_OPTS

您还可以按照下面@EUgene 的说明在 $SPARK_HOME/conf/spark-defaults.conf 中设置 spark.local.dir 属性

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

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