剖析HBase負載均衡和性能指標

1.概述

  在分佈式系統中,負載均衡是一個很是重要的功能,在HBase中經過Region的數量來實現負載均衡,HBase中能夠經過hbase.master.loadbalancer.class來實現自定義負載均衡算法。下面將爲你們剖析HBase負載均衡的相關內容以及性能指標。算法

2.內容

  在HBase系統中,負載均衡是一個週期性的操做,經過負載均衡來均勻分配Region到各個RegionServer上,經過hbase.balancer.period屬性來控制負載均衡的時間間隔,默認是5分鐘。觸發負載均衡操做是有條件的,可是若是發生以下狀況,則不會觸發負載均衡操做:sql

  • 負載均衡自動操做balance_switch關閉,即:balance_switch false
  • HBase Master節點正在初始化操做
  • HBase集羣中正在執行RIT,即Region正在遷移中
  • HBase集羣正在處理離線的RegionServer

2.1 負載均衡算法

  HBase在執行負載均衡操做時,如何判斷各個RegionServer節點上的Region個數是否均衡,這裏經過如下步驟來判斷:shell

  1. 計算均衡值的區間範圍,經過總Region個數以及RegionServer節點個數,算出平均Region個數,而後在此基礎上計算最小值和最大值
  2. 遍歷超過Region最大值的RegionServer節點,將該節點上的Region值遷移出去,直到該節點的Region個數小於等於最大值的Region
  3. 遍歷低於Region最小值的RegionServer節點,分配集羣中的Region到這些RegionServer上,直到大於等於最小值的Region
  4. 負責上述操做,直到集羣中全部的RegionServer上的Region個數在最小值與最大值之間,集羣纔算到達負載均衡,以後,即便再次手動執行均衡命令,HBase底層邏輯判斷會執行忽略操做

2.2 實例分析

  下面筆者經過一個實際的應用場景來給你們剖析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處理均衡狀態。

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大數據挖掘從入門到進階實戰》,喜歡的朋友或同窗, 能夠在公告欄那裏點擊購買連接購買博主的書進行學習,在此感謝你們的支持。

相關文章
相關標籤/搜索