Hadoop培训教程:HDFS负载均衡,HDFS的数据也许并不是非常均匀地分布在各个DataNode中。HDFS集群非常容易出现机器与机器之间磁盘利用率不平衡的情况,一个常见的原因是在现有的集群上经常会增添新的DataNode。当新增一个数据块(一个文件的数据被保存在一系列的块中)时,NameNode在选择DataNode接收这个数据块之前,要考虑到很多因素。其中的一些因素如下:
将数据块的一个副本放在正在写这个数据块的节点上。
尽量将数据块的不同副本分布在不同的机架上,这样集群可在完全失去某一机架的情况下还能存活。
一个副本通常被放置在和写文件的节点同一机架的某个节点上,这样可以减少跨越机架的网络I/O。
尽量均匀地将HDFS数据分布在集群的DataNode中。
由于上述多种考虑需要取舍,数据可能并不会均匀分布在DataNode中。当HDFS出现不平衡状况的时候,将引发很多问题,比如MapReduce程序无法很好地利用本地计算的优势,机器之间无法达到更好的网络带宽使用率、机器磁盘无法利用等。可见,保证HDFS中的数据平衡是非常重要的。为此,HDFS为管理员提供了一个工具,用于分析数据块分布和重新均衡DataNode上的数据分布:
$HADOOP_HOME/bin/start-balancer.sh -t 10%
在这个命令中,-t参数后面跟的是HDFS达到平衡状态的磁盘使用率偏差值。如果机器与机器之间磁盘使用率偏差小于10%,那么我们就认为HDFS集群已经达到了平衡状态。
Hadoop开发人员在开发负载均衡程序Balancer的时候,建议遵循以下几个原则。
在执行数据重分布的过程中,必须保证数据不能出现丢失,不能改变数据的备份数,不能改变每一个机架中所具备的Block数量。
系统管理员可以通过一条命令启动数据重分布程序或停止数据重分布程序。
Block在移动的过程中,不能占用过多的资源,如网络带宽。
数据重分布程序在执行的过程中,不能影响NameNode的正常工作。
HDFS数据重分布程序实现的逻辑流程,如图3-7所示。
负载均衡程序作为一个独立的进程与NameNode进行分开执行。从图3-7中可以看到,HDFS负载均衡的处理步骤如下:
1)负载均衡服务Rebalancing Server从NameNode中获取所有的DataNode情况,具体包括每一个DataNode磁盘使用情况,见图3-7中的流程1.get datanode report。
2)Rebalancing Server计算哪些机器需要将数据移动,哪些机器可以接受移动的数据,以及从NameNode中获取需要移动数据的分布情况,见图3-7中的流程2.get partial blockmap。
3)Rebalancing Server计算出来可以将哪一台机器的Block移动到另一台机器中去,见图3-7中流程3.copy a block。
4)需要移动Block的机器将数据移动到目标机器上,同时删除自己机器上的Block数据,见图3-7中的流程4、5、6。
5)Rebalancing Server获取本次数据移动的执行结果,并继续执行这个过程,一直到没有数据可以移动或HDFS集群已经达到平衡的标准为止,见图3-7中的流程7。
上述HDFS的这种负载均衡工作机制在绝大多数情况下都是非常适合的,然而一些特定的场景确实还是需要不同的处理方式,这里假定一种场景:
复制因子是3。
HDFS由两个机架(rack)组成。
两个机架中的机器磁盘配置不同,第一个机架中每一台机器的磁盘配置为2TB,第二个机架中每一台机器的磁盘配置为12TB。
大多数数据的两份备份都存储在第一个机架中。
在这样的情况下,HDFS集群中的数据肯定是不平衡的,现在运行负载均衡程序,会发现运行结束以后整个HDFS集群中的数据依旧不平衡:rack1中的磁盘剩余空间远远小于rack2,这是因为负载均衡程序的原则是不能改变每一个机架中所具备的Block数量的。简单地说,就是在执行负载均衡程序的时候,不会将数据从一个机架移到另一个机架中,所以就导致了负载均衡程序永远无法平衡HDFS集群的情况。
针对于这种情况就需要HDFS系统管理员手动操作来达到负载均衡,操作步骤如下:
1)继续使用现有的负载均衡程序,但修改机架中的机器分布,将磁盘空间小的机器部署到不同的机架中去。
2)修改负载均衡程序,允许改变每一个机架中所具有的Block数量,将磁盘空间告急的机架中存放的Block数量减少,或者将其移到其他磁盘空间富余的机架中去。