我们的HDFS集群只有90%满,但有些datanode有一些100%满的磁盘。 这意味着当我们大量重启整个集群时,一些datanodes完全无法启动,如下所示:
2013-10-26 03:58:27,295错误org.apache.hadoop.hdfs.server.datanode.DataNode:java.io.IOException:Mkdirs无法创build/ mnt / local / sda1 / hadoop / dfsdata / blocksBeingWritten
在我们开始经历真正的数据丢失之前,只有三个人必须以这种方式失败。
目前我们通过减less为root用户保留的空间量来解决这个问题,但是我们最终会耗尽。 我们也经常运行重新平衡器,但是有些磁盘仍然保持在100%。
由于卷未失败,因此更改dfs.datanode.failed.volumes.tolerated设置不是解决scheme。
有任何想法吗?
根据这个默认的HDFS参数 , dfs.datanode.du.reserved
是每个卷。 因此,如果将其设置为10 GB,并且您的datanode具有4个为HDFSconfiguration的卷,则将为非DFS使用预留40 GB的空间。
也许你应该手动在一个数据节点内将数据从一个卷移到另一个卷:
3.12。 在单个数据节点上,如何平衡磁盘上的块?
Hadoop目前没有一个方法来自动做到这一点。 要手动执行此操作:
来源: https : //wiki.apache.org/hadoop/FAQ
对于你的情况,平衡你的数据在群集datanodes可能会帮助你避免磁盘变满,即使整个群集有空间,你可以强制运行hadoop oob平衡器periodic.this将洗牌块所以datanodes将消耗相同数量的磁盘空间
hadoop balancer
你可以指定这个脚本的阈值,将hdfs块平衡,默认是10,如果你认为10%是不够的,你可以指定较低的数字,我已经看到你已经使用hdfs的90%的空间,所以你可以去5
hadoop balancer 5
检查这些link1 link2也更多的平衡器
我想你真正想要的是将dfs.datanode.du.reserved设置为非零值,这样datanode可以确保在系统的HDFS卷上始终有足够的空间。
注意:dfs.datanode.du.reserved是整个系统上的可用空间,而不是每个卷。
根据HDFS-1564 ,有关制作每卷的选项的讨论,但它不是针对任何特定的版本。