Hadoop Balancer原理分析

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

source
belowAvgUtilizedDatanod es
target
Pair<source,target> Source { NodeTask { target } }
Source Target匹配原则

DN按照异Rack( off-rack )进行DN匹配
3、under区有节点(还没有和above区匹配过)
Hadoop Balancer详解
康承昆 2012223040060
基本概念




“过载节点”是指存储使用率大于“平均存储 使用率+允许偏差”的节点; “负载节点”是指存储使用率小于“平均存储 使用率-允许偏差”的节点。 存储使用率表示一个数据节点上已用空间 占可用空间的百分比; 可用空间指的是分配给HDFS可使用的空间, 并非是节点所在机器的全部硬盘空间。

将Source对应的DataNode中的数据移动到 Target对应的DataNode中
选择数据移动的源节点和目的节点的依据



对于负载节点,依据以下条件随机选取选取作为其source,条 件优先级自上而下递减 同一机架上的过载节点 同一机架上的高于平均使用率的节点 其他机架上的过载节点 其他机架上的高于平均使用率的节 对于过载节点,依据以下条件随机选取选取作为其destination, 条件优先级自上而下递减 同一机架上的负载节点 同一机架上的低于平均使用率的节点 其他机架上的负载节点 其他机架上的低于平均使用率的节点

Balancer的设计

单独作为一个daemon运行

避开和主节点放在一台机器运行

运行达到平衡后,daemon会自动退出,因 此需要定期启动,平衡集群数据
Balancer原理

Balancer根据用户设置的thld值,将DataNode利用率分为 四种,如下图:
overUtilizedDatanodes avgUtilization+ thld aboveAvgUtilizedDatanodes avgUtilization avgUtilization- thld belowAvgUtilizedDatanodes underUtilizedDatanodes
if (utilization >= avgUtil+threshold || utilization <= avgUtil-threshold) { // over区和under区(两端),移动该数据量后,节点未必会平衡 maxSizeToMove = (long)(threshold*datanode.getCapacity()/100); } else { // above和below区,移动该数据量后,节点肯定还在平衡区中 maxSizeToMove = (long)(Math.abs(avgUtil-utilization)*datanode.getCapacity()/100); } if (utilization < avgUtil ) { // 如果是target节点,还要考虑磁盘剩余可用空间 maxSizeToMove = Math.min(datanode.getRemaining(), maxSizeToMove); } // MAX_SIZE_TO_MOVE固定为10G,不可配置,需要修改源码 maxSizeToMove = Math.min(MAX_SIZE_TO_MOVE, maxSizeToMove);
其中: avgUtilization= totalUsedSpace/totalCapacity*100


Balancer处理最上面和最下面的两个区域。对于 avgUtilization-thld ~ avgUtilization+thld间的,认为已经是 平衡的。 Thld可以在启动时,通过-thresld参数设置,默认为10.
overUtilizedDatanodes
source
underUtilizedDatanodes
target
Pair<source,target> Source { NodeTask { target } }
Source Target匹配原则

首先按照同Rack进行DN匹配
2、匹配over区和below区

availableSize = maxMoveSize - scheduledSize 其中 scheduledSize初始为0,当出现多个匹配(如<A,B>,<A,C>)时,计算 后一对时( <A,C>) ,要减去第一队中已经配比好的移动大小(<A,B>)。
Balancer调度原则

针对匹配每一对<source,target>,创建一个 线程,加入dispatcherExecutor中,代码逻 辑如下:
Future<?>[] futures = new Future<?>[sources.size()]; int i=0; for (Source source : sources) { futures[i++] = dispatcherExecutor.submit(source.new BlockMoveDispatcher()); } 注: 1、BlockMoveDispatcher调用了source的dispatchBlocks函数,该函数完成 主要迁移工作 2、这里看不到pair的概念,是因Baidu Nhomakorabea在Source中保存了NodeTask类,而 NodeTask类中保存了target的信息; 3、调度时,以source为单位,进行调度,一个source可能对应多个target (NodeTask);
over above below under
aboveAvgUtilizedDatanod es
source
underUtilizedDatanodes
target
Pair<source,target> Source { NodeTask { target } }
Source Target匹配原则

然后按照异Rack( off-rack )进行DN匹配
1、匹配over区和under区
for source in overUtilizedDataNodes choose target && notSameRack in underUtilizedDatanodes
over above below under
为何需要Balancer?

1、异构机器

磁盘容量不一样,可能存在部分DataNode磁盘 使用较高,而部分较低 新增机器机器后,只有新写的数据可能到新的 机器中,老数据不会自动迁移 HDFS上传策略中,如果上传机器为DataNode, 则默认的第一个备份会放在本机上

2、新增机器


3、固定的DataNode上上传数据
target
Pair<source,target> Source { NodeTask { target } }
Source Target匹配总结

经过On-Rack和Off-Rack匹配,本轮所有能移动的匹配对已经全部构建完 成。
over区
choose target under区 below区
above区
over above below under
Source Target匹配总结

构建每一对<source, target>时,会计算这一对可以移动的数据 大小,计算原则如下: min(source.availibaleSize(), target.availiableSize()), avaliable 计算如下
Source Target匹配总结

maxSizeToMove解释

对于Source节点

可以移走的最大数据量 可以接收的最大数据量

对于Target节点


意义

用于保证平衡区(above和below区)的节点经过balancer的一轮操作后(移走数据和接受数据),利用 率仍然在平衡区内。

maxSizeToMove计算
target
Pair<source,target> Source { NodeTask { target } }
Source Target匹配原则

首先按照同Rack进行DN匹配
3、under区有节点(还没有和above区匹配过)
for target in underUtilizedDatanodes choose source && sameRack in aboveAvgUtilizedDatanodes
for source in overUtilizedDataNodes choose target && sameRack in belowAvgUtilizedDatanodes
over above below under
overUtilizedDatanodes
source
belowAvgUtilizedDatanod es
Source Target匹配原则

首先按照同Rack进行DN匹配
1、匹配over区和under区
for source in overUtilizedDataNodes choose target && sameRack in underUtilizedDatanodes
over above below under

source_node_A :over区 maxSizeToMove=x(可以移走的) target_node_B: under区 maxSizeToMove=y(可以接收的) pair<A, B>,假设x>y,因此最多只能将x-y的数据移动到B,剩下的数据还需要找到一个C 节点,新城pair<A, C>
for target in underUtilizedDatanodes choose source && notsameRack in aboveAvgUtilizedDatanodes
over above below under
aboveAvgUtilizedDatanod es
source
underUtilizedDatanodes
Balancer调度原则

dispatchBlocks函数分析
1、从source节点获取block列表; 2、去除非法的block
破坏rack特性的block,已经传输的block
3、为合法的block寻找proxy节点,添加block到对应的target节 点的传输队列(队列长度默认不能超过5-MAX_NUM_CONCURRENT_MOVES) 4、创建实际执行的线程,加入线程池( ) 5、线程给target节点发送OP_REPLACE_BLOCK请求; 6、target节点中连接proxy进行block的复制请求,并将操作结 果范围给客户端(balancer处); 7、如果block的复制成功,balancer给proxy节点发出请求,删 掉对应的block;
Balancer移动原则

分为Source和Target

Source = {overUtilizedDatanodes,aboveAvgUtilizedDatanodes} Target = {belowAvgUtilizedDatanodes, underUtilizedDatanodes}
overUtilizedDatanodes
source
underUtilizedDatanodes
target
Pair<source,target> Source { NodeTask { target } }
Source Target匹配原则

然后按照异Rack( off-rack )进行DN匹配
2、匹配over区和below区
for source in overUtilizedDataNodes choose target && notsameRack in belowAvgUtilizedDatanodes
over above below under
overUtilizedDatanodes
choose source under区

On-Rack按照上图匹配三次,然后再按照Off-Rack匹配三次 Source和target中的节点,并不是一一对应的,可能是多对多(一个 source可以和多个target组成不同的pair,同理一个target也可以和多个 source组成不同的pair,取决于空间配比,比如:
相关文档
最新文档