漫談Hadoop HDFS Balancer

Hadoop的HDFS集羣很是容易出現機器與機器之間磁盤利用率不平衡的狀況,好比集羣中添加新的數據節點。當HDFS出現不平衡情況的時候,將引起不少問題,好比MR程序沒法很好地利用本地計算的優點,機器之間沒法達到更好的網絡帶寬使用率,機器磁盤沒法利用等等。可見,保證HDFS中的數據平衡是很是重要的。node

在Hadoop中,包含一個Balancer程序,經過運行這個程序,可使得HDFS集羣達到一個平衡的狀態,使用這個程序的命令以下:網絡

sh $HADOOP_HOME/bin/start-balancer.sh –t 10%ide

這個命令中-t參數後面跟的是HDFS達到平衡狀態的磁盤使用率誤差值。若是機器與機器之間磁盤使用率誤差小於10%,那麼咱們就認爲HDFS集羣已經達到了平衡的狀態。oop

Hadoop的開發人員在開發Balancer程序的時候,遵循瞭如下幾點原則:spa

1.    在執行數據重分佈的過程當中,必須保證數據不能出現丟失,不能改變數據的備份數,不能改變每個rack中所具有的block數量。blog

2.    系統管理員能夠經過一條命令啓動數據重分佈程序或者中止數據重分佈程序。進程

3.    Block在移動的過程當中,不能暫用過多的資源,如網絡帶寬。資源

4.    數據重分佈程序在執行的過程當中,不能影響name node的正常工做。開發

基於這些基本點,目前Hadoop數據重分佈程序實現的邏輯流程以下圖所示:get

 

 

Rebalance程序做爲一個獨立的進程與name node進行分開執行。

1 Rebalance Server從Name Node中獲取全部的Data Node狀況:每個Data Node磁盤使用狀況。

2 Rebalance Server計算哪些機器須要將數據移動,哪些機器能夠接受移動的數據。而且從Name Node中獲取須要移動的數據分佈狀況。

3 Rebalance Server計算出來能夠將哪一臺機器的block移動到另外一臺機器中去。

4,5,6 須要移動block的機器將數據移動的目的機器上去,同時刪除本身機器上的block數據。

7  Rebalance Server獲取到本次數據移動的執行結果,並繼續執行這個過程,一直沒有數據能夠移動或者HDFS集羣以及達到了平衡的標準爲止。

Hadoop現有的這種Balancer程序工做的方式在絕大多數狀況中都是很是適合的。

如今咱們設想這樣一種狀況:

1 數據是3份備份。

2 HDFS由2個rack組成。

3 2個rack中的機器磁盤配置不一樣,第一個rack中每一臺機器的磁盤空間爲1TB,第二個rack中每一臺機器的磁盤空間爲10TB。

4 如今大多數數據的2份備份都存儲在第一個rack中。

在這樣的一種狀況下,HDFS級羣中的數據確定是不平衡的。如今咱們運行Balancer程序,可是會發現運行結束之後,整個HDFS集羣中的數據依舊不平衡:rack1中的磁盤剩餘空間遠遠小於rack2。

這是由於Balance程序的開發原則1致使的。

簡單的說,就是在執行Balancer程序的時候,不會將數據中一個rack移動到另外一個rack中,因此就致使了Balancer程序永遠沒法平衡HDFS集羣的狀況。

針對於這種狀況,能夠採起2中方案:

1 繼續使用現有的Balancer程序,可是修改rack中的機器分佈。將磁盤空間小的機器分叉到不一樣的rack中去。

2 修改Balancer程序,容許改變每個rack中所具有的block數量,將磁盤空間告急的rack中存放的block數量減小,或者將其移動到其餘磁盤空間富餘的rack中去。

更多關於Hadoop的文章,能夠參考:http://www.cnblogs.com/gpcuster/tag/Hadoop/

相關文章
相關標籤/搜索