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為132。
由於實例中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命令來實現,操作如下:
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_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大數據挖掘從入門到進階實戰》,喜歡的朋友或同學, 可以在公告欄那里點擊購買鏈接購買博主的書進行學習,在此感謝大家的支持。
