千家信息网

HBase负载均衡算法概述及详解

发表于:2025-01-21 作者:千家信息网编辑
千家信息网最后更新 2025年01月21日,下文给大家带来HBase负载均衡算法概述及详解,希望能够给大家在实际运用中带来一定的帮助,负载均衡涉及的东西比较多,理论也不多,网上有很多书籍,今天我们就用在行业内累计的经验来做一个解答。1.概要0.
千家信息网最后更新 2025年01月21日HBase负载均衡算法概述及详解

下文给大家带来HBase负载均衡算法概述及详解,希望能够给大家在实际运用中带来一定的帮助,负载均衡涉及的东西比较多,理论也不多,网上有很多书籍,今天我们就用在行业内累计的经验来做一个解答。

1.概要

0.92版本后HBase的均衡算法可以通过实现了LoadBalancer接口的hbase.master.loadbalancer.class来自定义。

2.负载均衡实行条件。

负载均衡以特定时间间隔(hbase.balancer.period 默认是5分钟)执行。

当遇到如下场景时候不进行负载均衡:

1.均衡负载开关balanceSwitch关闭。

2.HMase为完成初始化。

3.RIT中有未处理完的regions。

4.有正在处理的DeadRegionserver.

3.默认负载均衡的具体算法

3.1 将所有RegionServer以负载进行排序,如果负载相同则按照serverName进行排序。

例子:

RS1 11
RS6 2
RS2 10
RS5 5
RS3 9排序为:RS3 9
RS4 10
RS2 10
RS5 5
RS4 10
RS6 2
RS1 11

3.2 通过如下算法计算当前是否需要进行均衡:

// Check if we even need to do any load balancingfloat average = (float)numRegions / numServers; // for logging// HBASE-3681 check sloppiness firstint floor = (int) Math.floor(average * (1 - slop));int ceiling = (int) Math.ceil(average * (1 + slop));if (serversByLoad.lastKey().getLoad() <= ceiling &&   serversByLoad.firstKey().getLoad() >= floor) {  // Skipped because no server outside (min,max) range  LOG.info("Skipping load balancing because balanced cluster; " +    "servers=" + numServers + " " +    "regions=" + numRegions + " average=" + average + " " +    "mostloaded=" + serversByLoad.lastKey().getLoad() +    " leastloaded=" + serversByLoad.firstKey().getLoad());  return null;}


根据如上算法在本例中:

float average = 47/ 6 = 7.8;

int floor = (int) Math.floor(average * (1- slop)) = 6

intceiling = (int) Math.ceil(average * (1+ slop)) = 9

其中slop为hbase.regions.slop 默认为0.2

可以看出RS6 上只有2个region < floor 所以本例需要进行负载均衡。


3.3 计算 min 和 max 得到最小负载和最大负载

int min = numRegions / numServers;int max = numRegions % numServers == 0 ? min : min + 1;

本例中:

min = 7

max = 8


3.4 将大于max负载的RS降低到max负载,移除的Region放入regionsToMove队列待分配。

RS6 2
RS6 2
RS5 5
RS5 5
RS3 9max:8RS3 8
RS2 10
RS2 8
RS4 10
RS4 8
RS1 11
RS1 8





regionsToMove


RS3 1


RS2 2


RS4 2


RS1 3

3.5 将小于min负载的RS从regionsToMove队列中取出全部加到min负载

RS6 2
RS6 7
RS5 5
RS5 7
RS3 8min:7RS3 8
RS2 8
RS2 8
RS4 8
RS4 8
RS1 8
RS1 8





regionsToMove


RS1 1

3.6 这里分为两种情况:

a.当所有< min负载RS都升到min负载时regionsToMove队列还有剩余region的时候则将遍历min负载的RS起始达到max。

b.当还有RS负载 < min的时候从max负载RS中取得需要的region数(这些region正好能够使未min的RS负载到min)放入regionsToMove队列,在进行region分配,使得


本例中符合a这种场景,所以直接将剩下的1个region分配到min负载热RS上:

RS6 7
RS6 8
RS5 7
RS5 7
RS3 8分配RS3 8
RS2 8
RS2 8
RS4 8
RS4 8
RS1 8
RS1 8





regionsToMove




3.7 由此负载均衡算法结束,他将产生一个region分配列表交由AssignmentManager类去进行region的

unasign和asign操作。


需要注意的时候在进行负载均衡操作不会对元数据表的region进行移动。

看了以上关于HBase负载均衡算法概述及详解,如果大家还有什么地方需要了解的可以在行业资讯里查找自己感兴趣的或者找我们的专业技术工程师解答的,技术工程师在行业内拥有十几年的经验了。


0