Hadoop 分布式文件系统(Hadoop Distributed File System),简称 HDFS,被设计成适合运行在通用硬件上的分布式文件系统。GFS是谷歌一篇论文上所阐述的一个分布式文件系统。

两者均将数据分为一个分片(chunk/block/partition),以及对应会有多个副本,分别分布在不同的Node节点上,从而能够满足高可用以及稳定性的要求。但是对于一个Node以及其具体所包含的某个disk上,如果一个disk写满了,上面的所有副本都是只读状态,进而无论这个分片其它副本是否可写,整个分片状态会变为只读状态。

GFS的负载均衡rebalance

GFS论文上关于重新负载均衡的说明大致如下:

  1. 平衡chunk服务器之间的磁盘使用率
  2. 限制每个chunk服务器上“最近”的chunk的创建操作的次数
  3. chunk的副本分布在多个机架之间

通常情况下,master节点移走那些剩余空间低于平均值的chunk服务器上的副本,从而平衡系统整体的磁盘使用率。

这里只是说明了一些选择的原则以及目的,但是并没有给出具体的执行策略。

HDFS的负载均衡rebalance

这里先介绍一下其副本摆放策略,由于一些原因,HDFS实际上和GFS有一定的类似性。

HDFS副本摆放策略

对于一个多副本的block:

第一副本:放置在上传文件的DataNode上;如果是集群外提交,则随机挑选一台磁盘不太慢、CPU不太忙的节点上; 第二副本:放置在于第一个副本不同的机架的节点上; 第三副本:与第二个副本相同机架的不同节点上; 如果还有更多的副本:随机放在节点中;如下图所示。

hdfs datanode数据负载均衡 hdfs负载均衡命令_hdfs

HDFS中存储的文件的副本数由上传文件时设置的副本数决定。无论以后怎么更改系统副本系数,这个文件的副本数都不会改变。

HDFS需要负载均衡的原因

集群非常容易出现机器与机器之间磁盘利用率不平衡的情况,例如:当集群内新增、删除节点,或者某个节点机器内硬盘存储达到饱和值。 需要对HDFS进行数据的负载均衡调整,即对各节点机器上数据的存储分布进行调整。从而,让数据均匀的分布在各个DataNode上,均衡IO性能,防止热点的发生。

HDFS负载均衡原则

  1. 数据平衡不能导致数据块减少,数据块备份丢失。不能改变每一个rack中所具备的block数量,即首先在同机架内均衡。
  2. 可以中止数据平衡进程
  3. 每次移动的数据量以及占用的网络资源,必须是可控的
  4. 数据均衡过程,不能影响namenode的正常工作

HDFS负载均衡控制

两个控制的点:

  1. Threshold:负载均衡的阈值,默认是10%。如果值太小,就会因为细微的变化,进而一直处于balance状态。

Threshold参数为集群是否处于均衡状态设置了一个目标。如果每一个datanode的利用率(已使用空间/节点总容量)和集群利用率(集群已使用空间/集群总容量)不超过Threshold参数值,则认为这个集群是均衡的。Threshold参数值越小,集群会越均衡。但是以一个较小的threshold值运行balancer带到平衡时花费的时间会更长。同时,如果设置了一个较小的threshold,但是在线上环境中,hadoop集群在进行balance时,还在并发的进行数据的写入和删除,所以有可能无法到达设定的平衡参数值。

  1. 带宽:可以通过配置项,控制负载均衡占用的带宽,进而能够有效避免对正常读写操作带来影响
  2. MAX_NUM_CONCURRENT_MOVES:允许同时并发复制的块数 默认为5

HDFS负载均衡流程

算法流程如下图所示

hdfs datanode数据负载均衡 hdfs负载均衡命令_hdfs datanode数据负载均衡_02

 

  1. 数据均衡服务(Rebalancing Server)首先要求 NameNode 生成 DataNode 数据分布分析报告,获取每个DataNode磁盘使用情况。
  2. Rebalancing Server汇总需要移动的数据分布情况,计算具体数据块迁移路线图。数据块迁移路线图,确保网络内最短路径。并且从Name Node中获取需要移动的数据分布情况。
  3. 开始数据块迁移任务,Proxy Source Data Node复制一块需要移动数据块。Rebalance Server计算出来可以将哪一台机器的block移动到另一台机器中去。
  4. 将复制的数据块复制到目标DataNode上
  5. 删除原始数据块
  6. 目标DataNode向Proxy Source Data Node确认该数据块迁移完成
  7. Proxy Source Data Node向Rebalancing Server确认本次数据块迁移完成。然后继续执行这个过程,直至集群达到数据均衡标准

balancer在如下5种情况下会自动退出: ①集群已达到均衡状态; ②没有block能被移动; ③连续5次迭代移动没有任何一个block被移动; ④当与namenode交互式出现了IOException; ⑤另一个balancer在运行中。

1-7为一个迭代,这个工具迭代的把数据块从利用率高的datanode移到利用率低的datanode。

通俗来说步骤如下

  1. 统一计算一遍,每个DN磁盘使用情况-应该是DN级别的,不用细化到具体的某一块盘
  2. 根据设置的阈值Threshold,分成四组, over(>平均值+Threshold)、above(>平均值,<平均值+Threshold)、below、under(<平均值+Threshold) 分别放到四个map存放
  3. 划分移动的起始,执行移动 从源节点列表和目标节点列表中各自选择节点组成一个个对,选择顺序优先为同节点组,同机架,然后是针对所有。
    1)over中选节点-->under 2)over中剩下的-->below 3)剩下的

部分步骤的详细说明

第二步分组的逻辑

HDFS会把当前的DataNode节点,根据阈值的设定情况划分到Over、Above、Below、Under四个组中。在移动数据块的时候,Over组、Above组中的块向Below组、Under组移动。四个组定义如下:

hdfs datanode数据负载均衡 hdfs负载均衡命令_分布式_03

 

  • 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

第二步迁移路线的逻辑

  1. first step: match each overUtilized datanode (source) to one or more underUtilized datanodes (targets). 匹配每个过载数据节点(src)转移到一个或多个空载的数据节点(targets)
  2. 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中没有达到最大移动值的过载节点。
  3. 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中没有达到最大移动值的过载节点。
  4. 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节点