在分布式系统中,负载均衡是一个很是重要的功能,在HBase中经过Region的数量来实现负载均衡,HBase中能够经过hbase.master.loadbalancer.class来实现自定义负载均衡算法。下面将为你们剖析HBase负载均衡的相关内容以及性能指标。算法
在HBase系统中,负载均衡是一个周期性的操做,经过负载均衡来均匀分配Region到各个RegionServer上,经过hbase.balancer.period属性来控制负载均衡的时间间隔,默认是5分钟。触发负载均衡操做是有条件的,可是若是发生以下状况,则不会触发负载均衡操做:sql
HBase在执行负载均衡操做时,如何判断各个RegionServer节点上的Region个数是否均衡,这里经过如下步骤来判断:shell
下面笔者经过一个实际的应用场景来给你们剖析HBase负载均衡算法的实现流程。举个例子,假如咱们当前有一个5台节点规模的HBase集群(包含Master和RegionServer),其中2台Master和3台RegionServer组成,每台RegionServer上的Region个数,以下图所示。apache
在执行负载均衡操做以前,会计算集群中总的Region个数,当前实例中集群中的Region总个数为175+56+99=330。而后计算每一个RegionServer须要容纳的Region平均值。计算结果以下:bash
平均值(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为132。curl
因为实例中RegionServer2的Region个数为56,小于最小值Region数88,而RegionServer1的Region个数为175,大于了最大值Region数132,因此须要负载均衡操做。分布式
HBase系统有提供管理员命令,来操做负载均衡,具体操做以下:工具
# 使用hbase shell命令进入到HBase控制台,而后开启自动执行负载均衡 hbase(main):001:0> balance_switch true
这样HBase负载均衡自动操做就开启了,可是,若是咱们须要当即均衡集群中的Region个数怎么办?这里HBase也提供了管理命令,经过balancer命令来实现,操做以下:oop
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处理均衡状态。
在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_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
在维护HBase集群时,好比重启某几个RegionServer节点后,可能会发送Region不均衡的状况,这时若是开启自动均衡后,须要当即使当前集群上其余RegionServer上的Region处于均衡状态,那么就可使用手动均衡操做。另外,HBase集群中各个RegionServer的耗时状况,可以反映当前集群的健康状态。
这篇博客就和你们分享到这里,若是你们在研究学习的过程中有什么问题,能够加群进行讨论或发送邮件给我,我会尽我所能为您解答,与君共勉!
另外,博主出书了《Hadoop大数据挖掘从入门到进阶实战》,喜欢的朋友或同窗, 能够在公告栏那里点击购买连接购买博主的书进行学习,在此感谢你们的支持。