Hadoop的HDFS集群非常容易出現機器與機器之間磁盤利用率不平衡的情況,比如集群中添加新的數據節點。當HDFS出現不平衡狀況的時候,將引發很多問題,比如MR程序無法很好地利用本地計算的優勢,機器之間無法達到更好的網絡帶寬使用率,機器磁盤無法利用等等。可見,保證HDFS中的數據平衡是非常重要的。
在Hadoop中,包含一個Balancer程序,通過運行這個程序,可以使得HDFS集群達到一個平衡的狀態,使用這個程序的命令如下:
sh $HADOOP_HOME/bin/start-balancer.sh –t 10%
這個命令中-t參數后面跟的是HDFS達到平衡狀態的磁盤使用率偏差值。如果機器與機器之間磁盤使用率偏差小於10%,那么我們就認為HDFS集群已經達到了平衡的狀態。
一 編程原則
Hadoop的開發人員在開發Balancer程序的時候,遵循了以下幾點原則:
1. 在執行數據重分布的過程中,必須保證數據不能出現丟失,不能改變數據的備份數,不能改變每一個rack中所具備的block數量。
2. 系統管理員可以通過一條命令啟動數據重分布程序或者停止數據重分布程序。
3. Block在移動的過程中,不能暫用過多的資源,如網絡帶寬。
4. 數據重分布程序在執行的過程中,不能影響name node的正常工作。
二 Balance邏輯
基於這些基本點,目前Hadoop數據重分布程序實現的邏輯流程如下圖所示:
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程序工作的方式在絕大多數情況中都是非常適合的。
三 數據平衡case
現在我們設想這樣一種情況:
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中去。