1. 概述
在分布式系统中, 负载均衡是一个非常重要的功能, 在 HBase 中通过 Region 的数量来实现负载均衡, HBase 中可以通过 hbase.master.loadbalancer.class 来实现自定义负载均衡算法. 下面将为大家剖析 HBase 负载均衡的相关内容以及性能指标.
2. 内容
在 HBase 系统中, 负载均衡是一个周期性的操作, 通过负载均衡来均匀分配 Region 到各个 RegionServer 上, 通过 hbase.balancer.period 属性来控制负载均衡的时间间隔, 默认是 5 分钟. 触发负载均衡操作是有条件的, 但是如果发生如下情况, 则不会触发负载均衡操作:
负载均衡自动操作 balance_switch 关闭, 即: balance_switch false
HBase Master 节点正在初始化操作
HBase 集群中正在执行 RIT, 即 Region 正在迁移中
HBase 集群正在处理离线的 RegionServer
2.1 负载均衡算法
HBase 在执行负载均衡操作时, 如何判断各个 RegionServer 节点上的 Region 个数是否均衡, 这里通过以下步骤来判断:
计算均衡值的区间范围, 通过总 Region 个数以及 RegionServer 节点个数, 算出平均 Region 个数, 然后在此基础上计算最小值和最大值
遍历超过 Region 最大值的 RegionServer 节点, 将该节点上的 Region 值迁移出去, 直到该节点的 Region 个数小于等于最大值的 Region
遍历低于 Region 最小值的 RegionServer 节点, 分配集群中的 Region 到这些 RegionServer 上, 直到大于等于最小值的 Region
负责上述操作, 直到集群中所有的 RegionServer 上的 Region 个数在最小值与最大值之间, 集群才算到达负载均衡, 之后, 即使再次手动执行均衡命令, HBase 底层逻辑判断会执行忽略操作
2.2 实例分析
下面笔者通过一个实际的应用场景来给大家剖析 HBase 负载均衡算法的实现流程. 举个例子, 假如我们当前有一个 5 台节点规模的 HBase 集群 (包含 Master 和 RegionServer), 其中 2 台 Master 和 3 台 RegionServer 组成, 每台 RegionServer 上的 Region 个数, 如下图所示.
在执行负载均衡操作之前, 会计算集群中总的 Region 个数, 当前实例中集群中的 Region 总个数为 175+56+99=330. 然后计算每个 RegionServer 需要容纳的 Region 平均值. 计算结果如下:
平均值 (110) = 总 Region 个数 (330) / RegionServers 总数 (3)
计算最小值和最大值来判断 HBase 集群是否需要进行负载均衡操作, 计算公式如下:
# hbase.regions.slop 权重值, 默认为 0.2
最小值 = Math.floor(平均值 * (1-0.2))
最大值 = Math.ceil(平均值 * (1+0.2))
HBase 集群如果判断各个 RegionServer 中的最小 Region 个数大于计算后的最小值, 并且最大 Region 个数小于最大值, 这是直接返回不会触发负载均衡操作. 根据实例中给出的 Region 数, 计算得出最小值 Region 为 88, 最大值 Region 为 120.
由于实例中 RegionServer2 的 Region 个数为 56, 小于最小值 Region 数 88, 而 RegionServer1 的 Region 个数为 175, 大于了最大值 Region 数 120, 所以需要负载均衡操作.
HBase 系统有提供管理员命令, 来操作负载均衡, 具体操作如下:
- # 使用 hbase shell 命令进入到 HBase 控制台, 然后开启自动执行负载均衡
- hbase(main):001:0> balance_switch true
这样 HBase 负载均衡自动操作就开启了, 但是, 如果我们需要立即均衡集群中的 Region 个数怎么办? 这里 HBase 也提供了管理命令, 通过 balancer 命令来实现, 操作如下:
hbase(main):001:0> balancer
但是, 这样每次手动执行, 每次均衡的个数不一定能满足要求, 那么我们可以通过封装该命令, 用脚本来调度执行, 具体实现代码如下:
- #! /bin/bash
- num=$1
- echo "[`date"+%Y-%m-%d %H:%M:%S"`] INFO : RegionServer Start Balancer..."
- if [ ! -n "$num" ]; then
- echo "[`date"+%Y-%m-%d %H:%M:%S"`] INFO : Default Balancer 20 Times."
- num=20
- elif [[ $num == *[!0-9]* ]]; then
- echo "[`date"+%Y-%m-%d %H:%M:%S"`] INFO : Input [$num] Times Must Be Number."
- exit 1
- else
- echo "[`date"+%Y-%m-%d %H:%M:%S"`] INFO : User-Defined Balancer [$num] Times."
- fi
- for (( i=1; i<=$num; i++ ))
- do
- echo "[`date"+%Y-%m-%d %H:%M:%S"`] INFO : Balancer [$i] Times,Total [$num] Times."
- echo "balancer"|hbase shell
- sleep 5
- done
脚本默认执行 20 次, 可以通过输入一个整型参数来自定义执行次数.
当 HBase 集群检查完所有的 RegionServer 上的 Region 个数已打要求, 那么此时集群的负载均衡操作就已经完成了. 如果没有达到要求, 可以再次执行上述脚本, 直到所有的 Region 个数在最小值和最大值之间为止. 当 HBase 集群中所有的 RegionServer 完成负载均衡后, 实例中的各个 RegionServer 上的 Region 个数分布, 如下图所示.
此时, 各个 RegionServer 节点上的 Region 个数均在最小值和最大值范围内, HBase 集群各个 RegionServer 节点上的 Region 处理均衡状态.
3. 性能指标
在 HBase 系统中, 有一个非常重要的性能指标, 那就是集群处理请求的延时. HBase 系统为了反应集群内部处理请求所耗费的时间, 提供了一个工具类, 即: org.apache.hadoop.hbase.tool.Canary, 这个类主要用户检查 HBase 系统的耗时状态. 如果不知道使用方法, 可以通过 help 命令来查看具体的用法, 命令如下:
hbase org.apache.hadoop.hbase.tool.Canary -help
(1) 查看集群中每个表中每个 Region 的耗时情况
hbase org.apache.hadoop.hbase.tool.Canary
(2) 查看 money 表中每个 Region 的耗时情况, 多个表之间使用空格分割
- # 查看 money 表和 person 表
- hbase org.apache.hadoop.hbase.tool.Canary money person
(3) 查看每个 RegionServer 的耗时情况
hbase org.apache.hadoop.hbase.tool.Canary -regionserver dn1
通常情况下, 我们比较关注每个 RegionServer 节点的耗时情况, 将该命令封装一下, 然后打印集群中每个 RegionServer 的耗时情况, 脚本实现如下所示:
- #########################################################
- # 将捕获的 RS 耗时, 写入到 InfluxDB 中进行存储, 用于绘制历史趋势图
- #########################################################
- #!/bin/bash
- post_influxdb_write='http://influxdb:8086/write?db=telegraf_mario_bank_rs'
- source /home/hadoop/.bash_profile
- for i in `cat rs.list`
- do
- timespanStr=`(hbase org.apache.hadoop.hbase.tool.Canary -regionserver $i 2>&1) | grep tool.Canary`
- timespanMs=`echo $timespanStr|awk -F '''{print $NF}'`
- timespan=`echo $timespanMs|awk -F "ms" '{print $1}'`
- echo `date +'%Y-%m-%d %H:%M:%S'` INFO : RegionServer $i delay $timespanMs .
- currentTime=`date "+%Y-%m-%d %H:%M:%S"`
- currentTimeStamp=`date -d "$currentTime" +%s`
- insert_sql="regionsever,host=$i value=$timespan ${currentTimeStamp}000000000"
- #echo $insert_sql
- curl -i -X POST "$post_influxdb_write" --data-binary "$insert_sql"
- done
- exit
4. 总结
在维护 HBase 集群时, 比如重启某几个 RegionServer 节点后, 可能会发送 Region 不均衡的情况, 这时如果开启自动均衡后, 需要立即使当前集群上其他 RegionServer 上的 Region 处于均衡状态, 那么就可以使用手动均衡操作. 另外, HBase 集群中各个 RegionServer 的耗时情况, 能够反映当前集群的健康状态.
5. 结束语
这篇博客就和大家分享到这里, 如果大家在研究学习的过程当中有什么问题, 可以加群进行讨论或发送邮件给我, 我会尽我所能为您解答, 与君共勉!
另外, 博主出书了Hadoop 大数据挖掘从入门到进阶实战, 喜欢的朋友或同学, 可以在公告栏那里点击购买链接购买博主的书进行学习, 在此感谢大家的支持.
来源: https://www.cnblogs.com/smartloli/p/9249259.html