漫谈Hadoop HDFS Balancer

Hadoop的HDFS集群很是容易出现机器与机器之间磁盘利用率不平衡的状况,好比集群中添加新的数据节点。当HDFS出现不平衡情况的时候,将引起不少问题,好比MR程序没法很好地利用本地计算的优点,机器之间没法达到更好的网络带宽使用率,机器磁盘没法利用等等。可见,保证HDFS中的数据平衡是很是重要的。node

在Hadoop中,包含一个Balancer程序,经过运行这个程序,可使得HDFS集群达到一个平衡的状态,使用这个程序的命令以下:网络

sh $HADOOP_HOME/bin/start-balancer.sh –t 10%ide

这个命令中-t参数后面跟的是HDFS达到平衡状态的磁盘使用率误差值。若是机器与机器之间磁盘使用率误差小于10%,那么咱们就认为HDFS集群已经达到了平衡的状态。oop

Hadoop的开发人员在开发Balancer程序的时候,遵循了如下几点原则:spa

1.    在执行数据重分布的过程当中,必须保证数据不能出现丢失,不能改变数据的备份数,不能改变每个rack中所具有的block数量。blog

2.    系统管理员能够经过一条命令启动数据重分布程序或者中止数据重分布程序。进程

3.    Block在移动的过程当中,不能暂用过多的资源,如网络带宽。资源

4.    数据重分布程序在执行的过程当中,不能影响name node的正常工做。开发

基于这些基本点,目前Hadoop数据重分布程序实现的逻辑流程以下图所示:get

 

 

Rebalance程序做为一个独立的进程与name node进行分开执行。

1 Rebalance Server从Name Node中获取全部的Data Node状况:每个Data Node磁盘使用状况。

2 Rebalance Server计算哪些机器须要将数据移动,哪些机器能够接受移动的数据。而且从Name Node中获取须要移动的数据分布状况。

3 Rebalance Server计算出来能够将哪一台机器的block移动到另外一台机器中去。

4,5,6 须要移动block的机器将数据移动的目的机器上去,同时删除本身机器上的block数据。

7  Rebalance Server获取到本次数据移动的执行结果,并继续执行这个过程,一直没有数据能够移动或者HDFS集群以及达到了平衡的标准为止。

Hadoop现有的这种Balancer程序工做的方式在绝大多数状况中都是很是适合的。

如今咱们设想这样一种状况:

1 数据是3份备份。

2 HDFS由2个rack组成。

3 2个rack中的机器磁盘配置不一样,第一个rack中每一台机器的磁盘空间为1TB,第二个rack中每一台机器的磁盘空间为10TB。

4 如今大多数数据的2份备份都存储在第一个rack中。

在这样的一种状况下,HDFS级群中的数据确定是不平衡的。如今咱们运行Balancer程序,可是会发现运行结束之后,整个HDFS集群中的数据依旧不平衡:rack1中的磁盘剩余空间远远小于rack2。

这是由于Balance程序的开发原则1致使的。

简单的说,就是在执行Balancer程序的时候,不会将数据中一个rack移动到另外一个rack中,因此就致使了Balancer程序永远没法平衡HDFS集群的状况。

针对于这种状况,能够采起2中方案:

1 继续使用现有的Balancer程序,可是修改rack中的机器分布。将磁盘空间小的机器分叉到不一样的rack中去。

2 修改Balancer程序,容许改变每个rack中所具有的block数量,将磁盘空间告急的rack中存放的block数量减小,或者将其移动到其余磁盘空间富余的rack中去。

更多关于Hadoop的文章,能够参考:http://www.cnblogs.com/gpcuster/tag/Hadoop/

相关文章
相关标签/搜索