天天看點

hbase源碼系列(一)Balancer 負載均衡

看源碼很久了,終于開始動手寫部落格了,為什麼是先寫負載均衡呢,因為一個室友入職新公司了,然後他們遇到這方面的問題,某些機器的硬碟使用明顯比别的機器要多,每次用hadoop做完負載均衡,很快又變回來了。

首先我們先看hmaster當中怎麼初始化balancer的,把叢集的狀态穿進去,設定master,然後執行初始化。

然後調用是在hmaster的balance()方法當中調用

可以看到它首先擷取了目前的叢集的配置設定情況,這個配置設定情況是根據表的 map<tablename, map<servername, list<hregioninfo>>,然後周遊這個map的values,調用balancer.balancecluster(assignments) 來生成一個partialplans,生成regionplan(region的移動計劃) 。

我們就可以切換到stochasticloadbalancer當中了,這個是預設balancer具體的實作了,也是最好的實作,下面就說說這玩意兒咋實作的。

看一下注釋,這個玩意兒吹得神乎其神的,它說它考慮到了這麼多因素:

好,我們從balancecluster開始看吧,一進來第一件事就是判斷是否需要平衡。

平衡的條件是:負載最大值和最小值要在平均值(region數/server數)的+-slop值之間, 但是這個平均值是基于表的,因為我們傳進去的參數clusterstate就是基于表的。

如果需要平衡的話,就開始計算開銷了。

上面的被我清除了細枝末節之後的代碼主體,okay,上面邏輯過程如下:

1. 生成一個虛拟的叢集cluster,友善計算計算目前狀态的開銷,其中clusterstate是表的狀态,loads是整個叢集的狀态。

2. 然後循環computedmaxsteps次,随機從選出一個picker來計算平衡方案。

<b>picker是啥?</b>這裡面有三個,第一個是randomregionpicker是随機挑選region,這裡就不詳細介紹了,主要讨論後面兩個;第二個loadpicker是計算負載的,第三個主要是考慮本地性的。給我感覺就很像zf的搖号器一樣,用哪種算法還要搖個号。

下面我們先看localitypicker的pick方法,這個方法是随機抽選出來一個server、region,找出region的其他本地機器,然後他們傳回。

okay,這個結束了,<b>下面我們看看loadpicker吧。</b>

這裡的負載高和負載低是按照server上面的region數來算的,而不是存儲檔案啥的,選出負載最高和負載最低的時候,又随機抽出region來傳回了。

pick挑選的過程介紹完了,那麼很明顯,計算才是重頭戲了,什麼樣的region會導緻計算出來的分數高低呢?

3. 重點在計算函數上 computecost(cluster, double.max_value) 結果這個函數也超級簡單,哈哈~

周遊costfunction,拿cost的權重平均和計算出來。

那costfunction裡面都有啥呢?localitycost又出現了,看來本地性是一個很大的考慮的情況。

可以看出來,裡面真正看中硬碟内容大小的,隻有一個storefilecostfunction,cost的計算方式有些差別,但都是一個0-1之間的數字,下面給出裡面5個函數都用過的cost的函數。

經過分析吧,我覺得影響裡面最後cost最大的是它的權重,下面給一下,這些function的預設權重。

storefile的預設值是5,那麼低。。。可以試着提高一下這個參數,使它在計算cost消耗的時候,産生更加正向的意義,效果不好說。

4. 根據虛拟的叢集狀态生成regionplan,這裡就不說了

源碼的分析完畢,要想減少存儲内容分布不均勻,可以試着考慮增加一個picker,這樣又不會缺少對其他條件的考慮,具體可以參考loadpicker,複制它的實作再寫一個,在pickmostloadedserver和pickleastloadedserver這兩個方法裡面把考慮的條件改一下,以前的條件是integer[] servers = cluster.serverindicessortedbyregioncount; 通過這個來查找一下負載最高和最低的server,那麼現在我們要在cluster裡面增加一個server ---&gt; storefile大小的關系映射集合,但是這裡面沒有,隻有regionloads,regionload這個類有一個方法getstorefilesizemb可以獲得storefile的大小,我們通過裡面的region和server的映射regionindextoserverindex來最後計算出來這個映射關系即可,這個計算映射關系個過程放在cluster的構造函數裡面。

繼續閱讀