1. 前言
HDFS的数据可能并不总是被均匀的置于所有的DataNode中,最常见的原因是向一个已经存在的集群添加一个新的节点。当放置新的块时(块:一个文件的数据会被存储为一系列的块)。NameNode 在选择DataNode节点存储这些块之前会考虑多方面参数。一些注意事项如下:
- 策略保证一个块的其中之一个副本在同一个节点(这个节点是块写的节点)
- 需要将一个块的副本分配到不同的机架上 ,这样可以确保集群丢失整个机架也没有影响
- 众多副本中的其中之一通常放在文件写入节点的同一个机架上,这样可以减少跨机架的网络I/O
- HDFS的数据均匀的分步到一个集群的所有节点中
由于多个相互竞争的考虑,整个datanode数据可能不是均匀放置。HDFS为管理员提供了一个工具,分析整个DataNode的块 位置和平衡数据。
2. Hadoop HDFS数据负载均衡原理
数据均衡过程的核心是一个数据均衡算法,该数据均衡算法将不断迭代数据均衡逻辑,直至集群内数据均衡为止。该数据均衡算法每次迭代的逻辑如下:
步骤分析如下:
- 数据均衡服务(Rebalancing Server)首先要求 NameNode 生成 DataNode 数据分布分析报告,获取每个DataNode磁盘使用情况;
- Rebalancing Server汇总需要移动的数据分布情况,计算具体数据块迁移路线图。数据块迁移路线图,确保网络内最短路径;
- 开始数据块迁移任务,Proxy Source Data Node复制一块需要移动数据块;
- 将复制的数据块复制到目标DataNode上;
- 删除原始数据块;
- 目标DataNode向Proxy Source Data Node确认该数据块迁移完成;
- Proxy Source Data Node向Rebalancing Server确认本次数据块迁移完成。然后继续执行这个过程,直至集群达到数据均衡标准。
2.1 DataNode归类策略
在第2步中,HDFS会把当前的DataNode节点,根据阈值的设定情况划分到Over、Above、Below、Under四个组中。在移动数据块的时候,Over组、Above组中的块向Below组、Under组移动。四个组定义如下:
Over组:
此组中的DataNode的均满足:DataNode_usedSpace_percent > Cluster_usedSpace_percent + threshold
Above组:
此组中的DataNode的均满足:Cluster_usedSpace_percent + threshold > DataNode_ usedSpace _percent > Cluster_usedSpace_percent
Below组:
此组中的DataNode的均满足:Cluster_usedSpace_percent > DataNode_ usedSpace_percent > Cluster_ usedSpace_percent – threshold
Under组:
此组中的DataNode的均满足:Cluster_usedSpace_percent – threshold > DataNode_usedSpace_percent
2.2 Hadoop HDFS 数据自动平衡脚本使用方法
在Hadoop中,包含一个start-balancer.sh
脚本,通过运行这个工具,启动HDFS数据均衡服务。该工具可以做到热插拔,即无须重启计算机和 Hadoop 服务。$HADOOP_HOME/sbin/
目录下的start−balancer.sh
脚本就是该任务的启动脚本。启动命令为:$HADOOP_HOME/sbin/start-balancer.sh
查看shell脚本发现其实就是启动了如下这个命令
$HADOOP_HOME/bin/hdfs balancer
脚本内容:
more $HADOOP_HOME/sbin/start-balancer.sh
....省略....
"$HADOOP_PREFIX"/sbin/hadoop-daemon.sh --config $HADOOP_CONF_DIR --script "$bin"/hdfs start balancer $@
参数如下:
Usage: hdfs balancer
[-policy <policy>] the balancing policy: datanode or blockpool
[-threshold <threshold>] Percentage of disk capacity
[-exclude [-f <hosts-file> | <comma-separated list of hosts>]] Excludes the specified datanodes.
[-include [-f <hosts-file> | <comma-separated list of hosts>]] Includes only the specified datanodes.
[-idleiterations <idleiterations>] Number of consecutive idle iterations (-1 for Infinite) before exit.
常用参数是-threshold 指定阀值
注: 在实际操作中发现 默认的负载均衡复制block的速度很慢,在集群压力较小时可考虑调整
hdfs-site.xml
如下配置提高速度。
# 默认1048576 是 1M/s
<property>
<name>dfs.balance.bandwidthPerSec</name>
<value>1048576</value>
<description> Specifies the maximum bandwidth that each datanode can utilize for the balancing purpose in term of the number of bytes per second. </description>
</property>