【问题标题】:Spark: java.io.IOException: No space left on deviceSpark:java.io.IOException:设备上没有剩余空间
【发布时间】:2015-07-21 16:08:37
【问题描述】:

现在我正在学习如何使用 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 创建了一些新的 rdd,并且在我的程序中 Spark 创建了太多的 rdd,所以我有例外。我不确定我的想法是否正确。

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

我试过rdd.unpersist(),还是不行。

【问题讨论】:

  • 我可能错了,但通常 spark 会将所有内容保存在内存中,如果它正在填满您的硬盘驱动器,可能您没有给他足够的 RAM 来开始。无论如何,您不能删除您“认为”不再使用的 RDD..
  • 您不必删除它们。 Result_i 仅在计算 result_{i+1} 所需的时间内保留(它仍然可以存储,但可以被覆盖)。您可能无法从您的一项计算中存储临时文件。
  • 但我不明白为什么我有 IOException 说设备上没有剩余空间...
  • Databricks 支持论坛的这个答案可能是相关的:forums.databricks.com/questions/277/…

标签: apache-spark rdd


【解决方案1】:

这是因为 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

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

【讨论】:

  • 这个设置如何避免临时文件磁盘空间问题?
  • 同样的问题,这个解决方案对我不起作用:(
  • 此解决方案有效,前提是您为 spark 提供一个有足够空间的可写文件夹(不要只是按原样复制粘贴给定答案)
【解决方案2】:

根据您提供的Error message,您的情况是硬盘上没有剩余磁盘空间。但是,这不是由 RDD 持久性引起的,而是您在调用 reduce 时隐式需要的 shuffle。

因此,您应该清理驱动器并为 tmp 文件夹腾出更多空间

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-29
      • 2012-01-14
      • 2012-05-15
      • 2018-11-22
      • 2020-12-16
      • 2014-11-20
      • 2018-12-27
      • 2015-09-25
      相关资源
      最近更新 更多