下面我将尽可能的以通俗的语言讲解HDFS的负载均衡技术。
HDFS架构天生支持数据均衡策略,举个例子:
如果某个DataNode节点上的空闲空间低于特定的临界值,按照负载均衡技术系统将会自动地将数据从这个DataNode移动到其他空闲的DataNode。
当对某个文件的请求突然增加,那么也可能启动一个计划创建该文件新的副本,并且同时重新平衡集群中的其他数据。
当HDFS负载不均衡时,需要对HDFS进行数据的负载均衡调整,即对各节点机器上数据的存储分布进行调整,从而让数据均匀的分布在各个DataNode上,以均衡各种性能,防止“热点”的发生:
在Hadoop的bin目录下,包含一个start-balancer.sh脚本,通过运行这个工具,启动HDFS数据均衡服务。启动命令为:
./start-balancer.sh -threshold
参数:
- -threshold
默认设置:10, 参数取值范围:0-100
参数含义:判断集群是否平衡的阈值。从理论上说,该参数值越小整个集群就越平衡。如果机器与机器之间磁盘使用率偏差小于10%,那么我们就认为HDFS集群已经达到了平衡状态。
- dfs.balance.bandwidthPerSec
默认设置:1048576(1M/S)
参数含义:Balancer运行时运行占用的带宽
举个例子:
# 启动数据均衡,阈值为5%
./start-balancer.sh - threshold 5
# 停止数据均衡
./stop-balancer.sh
同时我们还可以在hdfs-site.xml文件中设置数据均衡占用的网络带宽限制
<property>
<name>dfs.balance.bandwidthPerSec</name>
<value>1048576</value>
</property>
下面简要说明HDFS数据均衡的逻辑流程。
- 负载均衡服务Rebalancing Server从NameNode中获取所有的DataNode情况,具体包括每一个DataNode磁盘使用情况,即为上图中的流程1. get datanode report
- Rebalancing Server计算哪些机器需要将数据移动,哪些机器可以接受移动的数据,以及从NameNode中获取需要移动数据的分布情况,即为上图中的流程2.get partial blockmap。
- Rebalancing Server计算出来可以将哪一台机器的Block移动到另一台机器中去,即为上图中的流程3.copy a block。
- 需要移动Block的机器将数据移动到目标机器上,同时删除自己机器上的Block数据,见上图中的流程4、5、6。
- Rebalancing Server获取本次数据移动的执行结果,并继续执行这个过程,一直到没有数据可以移动或HDFS集群已经达到平衡的标准为止,即为上图中的流程7.confirm copy。