Hadoop-balancer执行原理

2024-09-03 16:32
文章标签 原理 执行 hadoop balancer

本文主要是介绍Hadoop-balancer执行原理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

核心类在

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

 

均衡算法 伪代码

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

 

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

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

initNodes()函数如下:

计算平均使用量long totalCapacity=0L, totalUsedSpace=0L;for (DatanodeInfo datanode : datanodes) {if (datanode.isDecommissioned() || datanode.isDecommissionInProgress()) {continue; // ignore decommissioning or decommissioned nodes}totalCapacity += datanode.getCapacity();totalUsedSpace += datanode.getDfsUsed();}

 

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

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

 

 

四个队列

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

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

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

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

 

2个参数

overLoadedBytes 超过负载值的字节

underLoadedBytes低于负载值的字节

//注意这里的阈值默认是10D,这里不是百分比计算集群平均使用率如果为0.5不是50%,而相当于0.5%
//所以如果是0.5-10D就变成负数了,一般来说肯定是小于当前节点使用率的,除非当前节点使用率特别大
//比如当前节点使用率为20,则用百分比来说就是使用了20%,这肯定就超于阈值了,于是这个节点的数据
//就需要均衡了
for (DatanodeInfo datanode : datanodes) {if(当前节点使用率 > 集群平均使用率) {if(当前节点使用率 <=(集群平均使用率+阀值) && 当前节点使用率 > 集群平均使用率) {创建一个BalancerDatanodeaboveAvgUtilizedDatanodes.save(当前节点)}else {overUtilizedDatanodes.save(当前节点)overLoadedBytes += (当前节点使用率-集群平均使用率-阀值)*当前节点总数据量/100}}else {创建一个BalancerDatanodeif(当前节点使用率>=(集群平均使用率-阀值) && 当前节点使用率<集群平均使用率) {belowAvgUtilizedDatanodes.save(当前节点)}else {underUtilizedDatanodes.save(当前节点)underLoadedBytes += (集群平均使用率-阀值-当前节点使用率)*当前节点总数据量/100}}
}均衡器只会执行 overUtilizedDatanodes 和 underUtilizedDatanodes队列中的集群

 

 

BalancerDatanode()构造函数

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

 

chooseNodes()函数


chooseNodes(true);	 //首先在相同机架中迁移
chooseNodes(false);	 //在不同机架中迁移chooseNodes(boolean onRack) {chooseTargets(underUtilizedDatanodes.iterator(), onRack);chooseTargets(belowAvgUtilizedDatanodes.iterator(), onRack);chooseSources(aboveAvgUtilizedDatanodes.iterator(), onRack);
}chooseTargets() {for(源节点 source : overUtilizedDatanodes列表) {选择目标节点(source)}
}选择目标节点(source) {while() {1.从候选队列中找到一个节点2.如果这个可转移的数据已经满了continue3.if(在相同机架中转移)4.if(在不同机架中转移)5.创建NodeTask}
}//和chooseTargets函数类似
chooseSources() {for(目标节点 target : underUtilizedDatanodes) {选择源节点()}
}选择源节点(target) {while() {1.从候选队列中找到一个节点2.如果这个节点可转移的数据已经满了continue3.if(在相同机架中转移)4.if(在不同机架中转移)5.创建NodeTask}
}控制台或者日志上会显示  Decided to move 3.55 GB bytes from source_host:50010 to target_host:50010

 

开始并行迁移数据

    for (Source source : sources) {futures[i++] = dispatcherExecutor.submit(source.new ());}

 

BlockMoveDispatcher线程

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

 

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

//使用阻塞IO的方式发送数据并接收返回的结果sock.connect(NetUtils.createSocketAddr(target.datanode.getName()), HdfsConstants.READ_TIMEOUT);sock.setKeepAlive(true);out = new DataOutputStream( new BufferedOutputStream(sock.getOutputStream(), FSConstants.BUFFER_SIZE));sendRequest(out);in = new DataInputStream( new BufferedInputStream(sock.getInputStream(), FSConstants.BUFFER_SIZE));receiveResponse(in);bytesMoved.inc(block.getNumBytes());

 

这篇关于Hadoop-balancer执行原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1133451

相关文章

解密SQL查询语句执行的过程

《解密SQL查询语句执行的过程》文章讲解了SQL语句的执行流程,涵盖解析、优化、执行三个核心阶段,并介绍执行计划查看方法EXPLAIN,同时提出性能优化技巧如合理使用索引、避免SELECT*、JOIN... 目录1. SQL语句的基本结构2. SQL语句的执行过程3. SQL语句的执行计划4. 常见的性能优

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

Spring Bean初始化及@PostConstruc执行顺序示例详解

《SpringBean初始化及@PostConstruc执行顺序示例详解》本文给大家介绍SpringBean初始化及@PostConstruc执行顺序,本文通过实例代码给大家介绍的非常详细,对大家的... 目录1. Bean初始化执行顺序2. 成员变量初始化顺序2.1 普通Java类(非Spring环境)(

Spring Boot 中的默认异常处理机制及执行流程

《SpringBoot中的默认异常处理机制及执行流程》SpringBoot内置BasicErrorController,自动处理异常并生成HTML/JSON响应,支持自定义错误路径、配置及扩展,如... 目录Spring Boot 异常处理机制详解默认错误页面功能自动异常转换机制错误属性配置选项默认错误处理

如何在Java Spring实现异步执行(详细篇)

《如何在JavaSpring实现异步执行(详细篇)》Spring框架通过@Async、Executor等实现异步执行,提升系统性能与响应速度,支持自定义线程池管理并发,本文给大家介绍如何在Sprin... 目录前言1. 使用 @Async 实现异步执行1.1 启用异步执行支持1.2 创建异步方法1.3 调用

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

Spring Boot Maven 插件如何构建可执行 JAR 的核心配置

《SpringBootMaven插件如何构建可执行JAR的核心配置》SpringBoot核心Maven插件,用于生成可执行JAR/WAR,内置服务器简化部署,支持热部署、多环境配置及依赖管理... 目录前言一、插件的核心功能与目标1.1 插件的定位1.2 插件的 Goals(目标)1.3 插件定位1.4 核

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景