Hadoop 分布式文件系统(Hadoop Distributed File System),简称 HDFS,被设计成适合运行在通用硬件上的分布式文件系统。GFS是谷歌一篇论文上所阐述的一个分布式文件系统。
两者均将数据分为一个分片(chunk/block/partition),以及对应会有多个副本,分别分布在不同的Node节点上,从而能够满足高可用以及稳定性的要求。但是对于一个Node以及其具体所包含的某个disk上,如果一个disk写满了,上面的所有副本都是只读状态,进而无论这个分片其它副本是否可写,整个分片状态会变为只读状态。
GFS的负载均衡rebalance
GFS论文上关于重新负载均衡的说明大致如下:
- 平衡chunk服务器之间的磁盘使用率
- 限制每个chunk服务器上“最近”的chunk的创建操作的次数
- chunk的副本分布在多个机架之间
通常情况下,master节点移走那些剩余空间低于平均值的chunk服务器上的副本,从而平衡系统整体的磁盘使用率。
这里只是说明了一些选择的原则以及目的,但是并没有给出具体的执行策略。
HDFS的负载均衡rebalance
这里先介绍一下其副本摆放策略,由于一些原因,HDFS实际上和GFS有一定的类似性。
HDFS副本摆放策略
对于一个多副本的block:
第一副本:放置在上传文件的DataNode上;如果是集群外提交,则随机挑选一台磁盘不太慢、CPU不太忙的节点上; 第二副本:放置在于第一个副本不同的机架的节点上; 第三副本:与第二个副本相同机架的不同节点上; 如果还有更多的副本:随机放在节点中;如下图所示。
HDFS中存储的文件的副本数由上传文件时设置的副本数决定。无论以后怎么更改系统副本系数,这个文件的副本数都不会改变。
HDFS需要负载均衡的原因
集群非常容易出现机器与机器之间磁盘利用率不平衡的情况,例如:当集群内新增、删除节点,或者某个节点机器内硬盘存储达到饱和值。 需要对HDFS进行数据的负载均衡调整,即对各节点机器上数据的存储分布进行调整。从而,让数据均匀的分布在各个DataNode上,均衡IO性能,防止热点的发生。
HDFS负载均衡原则
- 数据平衡不能导致数据块减少,数据块备份丢失。不能改变每一个rack中所具备的block数量,即首先在同机架内均衡。
- 可以中止数据平衡进程
- 每次移动的数据量以及占用的网络资源,必须是可控的
- 数据均衡过程,不能影响namenode的正常工作
HDFS负载均衡控制
两个控制的点:
- Threshold:负载均衡的阈值,默认是10%。如果值太小,就会因为细微的变化,进而一直处于balance状态。
Threshold参数为集群是否处于均衡状态设置了一个目标。如果每一个datanode的利用率(已使用空间/节点总容量)和集群利用率(集群已使用空间/集群总容量)不超过Threshold参数值,则认为这个集群是均衡的。Threshold参数值越小,集群会越均衡。但是以一个较小的threshold值运行balancer带到平衡时花费的时间会更长。同时,如果设置了一个较小的threshold,但是在线上环境中,hadoop集群在进行balance时,还在并发的进行数据的写入和删除,所以有可能无法到达设定的平衡参数值。
- 带宽:可以通过配置项,控制负载均衡占用的带宽,进而能够有效避免对正常读写操作带来影响
- MAX_NUM_CONCURRENT_MOVES:允许同时并发复制的块数 默认为5
HDFS负载均衡流程
算法流程如下图所示
- 数据均衡服务(Rebalancing Server)首先要求 NameNode 生成 DataNode 数据分布分析报告,获取每个DataNode磁盘使用情况。
- Rebalancing Server汇总需要移动的数据分布情况,计算具体数据块迁移路线图。数据块迁移路线图,确保网络内最短路径。并且从Name Node中获取需要移动的数据分布情况。
- 开始数据块迁移任务,Proxy Source Data Node复制一块需要移动数据块。Rebalance Server计算出来可以将哪一台机器的block移动到另一台机器中去。
- 将复制的数据块复制到目标DataNode上
- 删除原始数据块
- 目标DataNode向Proxy Source Data Node确认该数据块迁移完成
- Proxy Source Data Node向Rebalancing Server确认本次数据块迁移完成。然后继续执行这个过程,直至集群达到数据均衡标准
balancer在如下5种情况下会自动退出: ①集群已达到均衡状态; ②没有block能被移动; ③连续5次迭代移动没有任何一个block被移动; ④当与namenode交互式出现了IOException; ⑤另一个balancer在运行中。
1-7为一个迭代,这个工具迭代的把数据块从利用率高的datanode移到利用率低的datanode。
通俗来说步骤如下
- 统一计算一遍,每个DN磁盘使用情况-应该是DN级别的,不用细化到具体的某一块盘
- 根据设置的阈值Threshold,分成四组, over(>平均值+Threshold)、above(>平均值,<平均值+Threshold)、below、under(<平均值+Threshold) 分别放到四个map存放
- 划分移动的起始,执行移动 从源节点列表和目标节点列表中各自选择节点组成一个个对,选择顺序优先为同节点组,同机架,然后是针对所有。
1)over中选节点-->under 2)over中剩下的-->below 3)剩下的
部分步骤的详细说明
第二步分组的逻辑
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
第二步迁移路线的逻辑
- first step: match each overUtilized datanode (source) to one or more underUtilized datanodes (targets). 匹配每个过载数据节点(src)转移到一个或多个空载的数据节点(targets)
- match each remaining overutilized datanode (source) to below average utilized datanodes (targets). Note only overutilized datanodes that haven't had that max bytes to move satisfied in step 1 are selected
匹配剩下的过载数据节点(source)转移到低于平均利用率的数据节点(tartget)。注意:这些数据节点为firststep中没有达到最大移动值的过载节点。 - match each remaining underutilized datanode (target) to above average utilized datanodes (source). Note only underutilized datanodes that have not had that max bytes to move satisfied in step 1 are selected.
匹配剩下的每个空载节点(target)和高于平均利用率的数据节点(source)。转移到低于平均利用率的数据节点(tartget)。注意:这些数据节点为firststep中没有达到最大移动值的过载节点。 - For each datanode, choose matching nodes from the candidates. Either the datanodes or the candidates are source nodes with (utilization > Avg), and the others are target nodes with (utilization < Avg).
对每个数据节点,从候选节点中选择匹配节点。所有高于平均利用率的节点(所有数据节点和候选节点)作为source节点,其他的低于平均率的节点作为target节点