磁盘已满时,HDFS datanode启动失败

我们的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目前没有一个方法来自动做到这一点。 要手动执行此操作:

  1. closures涉及的DataNode
  2. 使用UNIX mv命令将单个块副本和元对从一个目录移动到所选主机上的另一个目录。 在具有HDFS-6482(Apache Hadoop 2.6.0+)的发行版上,还需要确保在跨磁盘移动块时,子目录名称的目录结构保持完全相同。 例如,如果块副本及其元对位于/data/1/dfs/dn/current/BP-1788246909-172.23.1.202-1412278461680/current/finalized/subdir0/subdir1/下,并且您想将其移动到/ data / 5 / disk,那么它必须移动到相同的子目录结构下面,即/data/5/dfs/dn/current/BP-1788246909-172.23.1.202-1412278461680/current/finalized/subdir0/subdir1/ 。 如果这不被保留,DN将不再能够在移动之后find副本。
  3. 重新启动DataNode。

来源: 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 ,有关制作每卷的选项的讨论,但它不是针对任何特定的版本。