设为首页 加入收藏

TOP

Hadoop-balancer执行原理
2019-02-16 00:38:08 】 浏览:69
Tags:Hadoop-balancer 执行 原理

核心类在

org.apache.hadoop.hdfs.server.balancer.Balancer

均衡算法 伪代码

  1. while(true){
  2. 1.获取需要迁移的字节数
  3. if(需要迁移字节数==0){
  4. return"成功,无需迁移";
  5. }
  6. 2.选择需要迁移的节点
  7. if(需要移动的数据==0){
  8. return"没有需要移动的块"
  9. }
  10. 3.开始并行迁移
  11. 4.清空列表
  12. 5.Thread.sleep(2*conf.getLong("dfs.heartbeat.interval",3));
  13. }

获取所有的data node节点,计算

initNodes(client.getDatanodeReport(DatanodeReportType.LIVE));

initNodes()函数如下:

  1. 计算平均使用量
  2. longtotalCapacity=0L,totalUsedSpace=0L;
  3. for(DatanodeInfodatanode:datanodes){
  4. if(datanode.isDecommissioned()||datanode.isDecommissionInProgress()){
  5. continue;//ignoredecommissioningordecommissionednodes
  6. }
  7. totalCapacity+=datanode.getCapacity();
  8. totalUsedSpace+=datanode.getDfsUsed();
  9. }

当前集群的平均使用率(是当前使用的空间/总空间*100),注意这个是百分比计算后再乘100的值,不是百分比

this.avgUtilization = ((double)totalUsedSpace)/totalCapacity*100;

四个队列

1.aboveAvgUtilizedDatanodes(超过集群平均使用率 && 低于集群平均使用率+阀值)

2.overUtilizedDatanodes(超过集群平均使用率+阀值)

3.belowAvgUtilizedDatanodes(低于集群平均使用率 && 超过集群平均使用率-阀值)

4.underUtilizedDatanodes(低于集群平均使用率-阀值)

2个参数

overLoadedBytes 超过负载值的字节

underLoadedBytes低于负载值的字节

  1. //注意这里的阈值默认是10D,这里不是百分比计算集群平均使用率如果为0.5不是50%,而相当于0.5%
  2. //所以如果是0.5-10D就变成负数了,一般来说肯定是小于当前节点使用率的,除非当前节点使用率特别大
  3. //比如当前节点使用率为20,则用百分比来说就是使用了20%,这肯定就超于阈值了,于是这个节点的数据
  4. //就需要均衡了
  5. for(DatanodeInfodatanode:datanodes){
  6. if(当前节点使用率>集群平均使用率){
  7. if(当前节点使用率<=(集群平均使用率+阀值)&&当前节点使用率>集群平均使用率){
  8. 创建一个BalancerDatanode
  9. aboveAvgUtilizedDatanodes.save(当前节点)
  10. }
  11. else{
  12. overUtilizedDatanodes.save(当前节点)
  13. overLoadedBytes+=(当前节点使用率-集群平均使用率-阀值)*当前节点总数据量/100
  14. }
  15. }
  16. else{
  17. 创建一个BalancerDatanode
  18. if(当前节点使用率>=(集群平均使用率-阀值)&&当前节点使用率<集群平均使用率){
  19. belowAvgUtilizedDatanodes.save(当前节点)
  20. }
  21. else{
  22. underUtilizedDatanodes.save(当前节点)
  23. underLoadedBytes+=(集群平均使用率-阀值-当前节点使用率)*当前节点总数据量/100
  24. }
  25. }
  26. }
  27. 均衡器只会执行overUtilizedDatanodes和underUtilizedDatanodes队列中的集群

BalancerDatanode()构造函数

  1. if(当前节点使用率>=集群平均使用率+阀值||当前节点使用率<=集群平均使用率-阀值){
  2. 一次移动的数据量=阀值*当前节点总容量/100
  3. }
  4. else{
  5. 一次移动的数据量=(集群平均使用率-当前节点使用率)*当前节点总容量/100
  6. }
  7. 一次移动的数据量=min(当前节点剩余使用量,一次移动的数据量)
  8. 一次移动的数据量=(一次移动数据量上限10G,一次移动的数据量)

chooseNodes()函数

  1. chooseNodes(true);//首先在相同机架中迁移
  2. chooseNodes(false);//在不同机架中迁移
  3. chooseNodes(booleanonRack){
  4. chooseTargets(underUtilizedDatanodes.iterator(),onRack);
  5. chooseTargets(belowAvgUtilizedDatanodes.iterator(),onRack);
  6. chooseSources(aboveAvgUtilizedDatanodes.iterator(),onRack);
  7. }
  8. chooseTargets(){
  9. for(源节点source:overUtilizedDatanodes列表){
  10. 选择目标节点(source)
  11. }
  12. }
  13. 选择目标节点(source){
  14. while(){
  15. 1.从候选队列中找到一个节点
  16. 2.如果这个可转移的数据已经满了continue
  17. 3.if(在相同机架中转移)
  18. 4.if(在不同机架中转移)
  19. 5.创建NodeTask
  20. }
  21. }
  22. //和chooseTargets函数类似
  23. chooseSources(){
  24. for(目标节点target:underUtilizedDatanodes){
  25. 选择源节点()
  26. }
  27. }
  28. 选择源节点(target){
  29. while(){
  30. 1.从候选队列中找到一个节点
  31. 2.如果这个节点可转移的数据已经满了continue
  32. 3.if(在相同机架中转移)
  33. 4.if(在不同机架中转移)
  34. 5.创建NodeTask
  35. }
  36. }
  37. 控制台或者日志上会显示Decidedtomove3.55GBbytesfromsource_host:50010totarget_host:50010

开始并行迁移数据

  1. for(Sourcesource:sources){
  2. futures[i++]=dispatcherExecutor.submit(source.new());
  3. }

BlockMoveDispatcher线程

  1. 1.选择要迁移的节点chooseNextBlockToMove()
  2. 2.if(要迁移的节点!=null){
  3. //启动数据迁移,创建一个新线程发送接收数据
  4. scheduleBlockMove()
  5. }
  6. 3.获取block列表,继续下一轮迁移

发送和接收数据块的dispatch()函数

  1. //使用阻塞IO的方式发送数据并接收返回的结果
  2. sock.connect(NetUtils.createSocketAddr(
  3. target.datanode.getName()),HdfsConstants.READ_TIMEOUT);
  4. sock.setKeepAlive(true);
  5. out=newDataOutputStream(newBufferedOutputStream(
  6. sock.getOutputStream(),FSConstants.BUFFER_SIZE));
  7. sendRequest(out);
  8. in=newDataInputStream(newBufferedInputStream(
  9. sock.getInputStream(),FSConstants.BUFFER_SIZE));
  10. receiveResponse(in);
  11. bytesMoved.inc(block.getNumBytes());

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇快速学习hadoop只有这些基础可不行 下一篇Hadoop提交作业------>hadoop..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目