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

sam*_*est 43 apache-spark

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

qui*_*ine 26

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

spark.local.dir                     SOME/DIR/WHERE/YOU/HAVE/SPACE
Run Code Online (Sandbox Code Playgroud)


sam*_*est 11

您还需要监视df -i哪些显示正在使用的inode数量.

在每台机器上,我们为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


uqb*_*uqb 10

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


Tha*_*Van 6

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


小智 5

此错误的另一种情况:

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

问题:

我的工作抛出错误"设备上没有剩余空间".你可以看到我的工作需要这么多的改组,所以为了解决这个问题,我最初使用了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"