为什么一项工作因“设备上没有剩余空间”而失败,但df说不然?

时间:2014-09-07 06:44:55

标签: apache-spark

当执行随机播放时,我的Spark工作失败并且说'#34;设备上没有剩余空间",但是当我运行df -h时,它说我有剩余空间!为什么会发生这种情况,我该如何解决?

8 个答案:

答案 0 :(得分:24)

默认情况下,Spark使用/tmp目录存储中间数据。如果您确实在某些设备上留有空间 - 您可以通过创建文件SPARK_HOME/conf/spark-defaults.conf并添加该行来更改此设置。这里SPARK_HOME就是你安装spark的根目录所在的地方。

spark.local.dir                     SOME/DIR/WHERE/YOU/HAVE/SPACE

答案 1 :(得分:10)

您还需要监控显示正在使用的inode数量的df -i

  

在每台机器上,我们为shuffle创建M * R临时文件,其中M =地图任务数,R =减少任务数。

https://spark-project.atlassian.net/browse/SPARK-751

如果您确实发现磁盘用完inode以解决问题,您可以:

修改

自1.6版以来,合并文件已从spark中删除。 https://issues.apache.org/jira/browse/SPARK-9808

答案 2 :(得分:8)

我遇到了类似的问题。默认情况下,spark使用“/ tmp”来保存中间文件。当作业运行时,您可以选项卡df -h以查看在“/”成长时安装的fs的已用空间。当dev的空间耗尽时,抛出此异常。为了解决这个问题,我在SPARK_HOME / conf / spark_defaults.conf中设置了SPARK_LOCAL_DIRS,其中fs中的路径留有足够的空间。

答案 3 :(得分:5)

此错误的另一种情况:

  1. 我有一个spark-job,它使用两个数据源(~150GB和~100GB)并执行内连接,多个分组,过滤和映射操作。
  2. 我使用spark ec-2脚本
  3. 创建了20个节点(r3.2xlarge)spark-cluster

    问题

    我的工作投掷错误“设备上没有剩余空间”。你可以看到我的工作需要这么多的改组,所以为了解决这个问题,我最初使用了20个节点,然后增加到40个节点。不知怎的,问题仍在发生。我尝试了所有其他的东西,比如更改spark.local.dir,重新分区,自定义分区和参数调整(压缩,spiling,内存,内存分数等)。另外,我使用了实例类型r3.2xlarge,它有1 x 160 SSD,但问题仍然存在。

    <强>解决方案

    我登录了其中一个节点,并执行df -h /我发现该节点只有一个安装的EBS卷(8GB),但没有SSD(160GB)。然后我查看了ls /dev/并附加了SSD。群集中的所有节点都没有发生此问题。仅针对未安装SSD的节点发生错误“设备上没有剩余空间”。因为他们只处理8GB(EBS),并且可以使用~4 GB的空间。

    我创建了另一个bash脚本,它使用spark-ec2脚本启动spark集群,然后在格式化之后安装它。

    1. ec2-script启动群集
    2. MASTER_HOST = <ec2-script> get-master $CLUSTER_NAME
    3. ssh -o StrictHostKeyChecking=no root@$MASTER_HOST "cd /root/spark/sbin/ && ./slaves.sh mkfs.ext4 -E lazy_itable_init=0,lazy_journal_init=0 /dev/sdb && ./slaves.sh mount -o defaults,noatime,nodiratime /dev/sdb /mnt"

答案 4 :(得分:3)

在工作者计算机上,将环境变量“SPARK_LOCAL_DIRS”设置为具有可用空间的位置。设置配置变量“spark.local.dir”在Spark 1.0及更高版本中不起作用。

答案 5 :(得分:2)

其他一些解决方法:

  • 明确删除intermidiate shuffe文件。如果你不想要 保持rdd以便以后计算,你可以调用.unpersist() 这将标记中间的shuffle文件以便删除(你可以 也将rdd变量重新分配给None)。

  • 使用更多的工人,增加更多的工人将平均减少 需要的中间文件数/工人数。

更多关于&#34;设备上没有空间&#34;此databricks线程上的错误: https://forums.databricks.com/questions/277/how-do-i-avoid-the-no-space-left-on-device-error.html

答案 6 :(得分:0)

请更改 SPARK_HOME 目录,因为我们必须为目录提供更多空间,以便顺利运行我们的工作。

答案 7 :(得分:0)

这是什么空间?

Spark实际上将来自“映射”任务和RDD的临时输出文件写入名为“暂存空间” 的外部存储,默认情况下,“暂存空间”位于本地计算机的 / tmp < / strong>目录。

/ tmp通常是操作系统(OS)的临时输出目录,可由OS用户访问,而/ tmp通常很小,位于单个磁盘上。因此,当Spark运行大量作业,长时间作业或复杂的作业时,/ tmp可能会很快填满,从而迫使Spark抛出“设备上没有剩余空间”的异常。

由于Spark会不断对其暂存空间进行写入和读取操作,因此磁盘IO可能很重,并且可能减慢您的工作量。解决此问题并提高性能的最佳方法是分配尽可能多的磁盘来处理临时空间磁盘IO。为此,请在spark.local.dir配置文件中显式定义参数spark-defaults.conf,如下所示:

spark.local.dir /data1/tmp,/data2/tmp,/data3/tmp,/data4/tmp,/data5/tmp,/data6/tmp,/data7/tmp,/data8/tmp

以上逗号分隔的设置会将Spark暂存空间分散到8个磁盘上(确保每个/ data *目录都配置在单独的物理数据磁盘上),并位于/ data * / tmp目录下。您可以创建任何子目录名称,而不是“ tmp”。

来源:https://developer.ibm.com/hadoop/2016/07/18/troubleshooting-and-tuning-spark-for-heavy-workloads/