天天看點

剖析HBase負載均衡和性能名額1.概述2.内容3.性能名額4.總結5.結束語 

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個數是否均衡,這裡通過以下步驟來判斷:

  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個數,如下圖所示。

  

剖析HBase負載均衡和性能名額1.概述2.内容3.性能名額4.總結5.結束語 

  在執行負載均衡操作之前,會計算叢集中總的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個數分布,如下圖所示。

剖析HBase負載均衡和性能名額1.概述2.内容3.性能名額4.總結5.結束語 

  此時,各個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大資料挖掘從入門到進階實戰》,喜歡的朋友或同學, 可以在公告欄那裡點選購買連結購買部落客的書進行學習,在此感謝大家的支援。

聯系方式:

郵箱:[email protected]

Twitter:

https://twitter.com/smartloli

QQ群(Hadoop - 交流社群1):

424769183

溫馨提示:請大家加群的時候寫上加群理由(姓名+公司/學校),友善管理者稽核,謝謝!

熱愛生活,享受程式設計,與君共勉!

作者:哥不是小蘿莉 [ 關于我 ][ 犒賞

出處: http://www.cnblogs.com/smartloli/

轉載請注明出處,謝謝合作!