Hadoop培訓教程:HDFS負載均衡,HDFS的數據也許並不是非常均勻地分布在各個DataNode中。HDFS集群非常容易出現機器與機器之間磁盤利用率不平衡的情況,一個常見的原因是在現有的集群上經常會增添新的DataNode。當新增一個數據塊(一個文件的數據被保存在一系列的塊中)時,NameNode在選擇DataNode接收這個數據塊之前,要考慮到很多因素。其中的一些因素如下:
將數據塊的一個副本放在正在寫這個數據塊的節點上。
盡量將數據塊的不同副本分布在不同的機架上,這樣集群可在完全失去某一機架的情況下還能存活。
一個副本通常被放置在和寫文件的節點同一機架的某個節點上,這樣可以減少跨越機架的網絡I/O。
盡量均勻地將HDFS數據分布在集群的DataNode中。
由於上述多種考慮需要取舍,數據可能並不會均勻分布在DataNode中。當HDFS出現不平衡狀況的時候,將引發很多問題,比如MapReduce程序無法很好地利用本地計算的優勢,機器之間無法達到更好的網絡帶寬使用率、機器磁盤無法利用等。可見,保證HDFS中的數據平衡是非常重要的。為此,HDFS為管理員提供了一個工具,用於分析數據塊分布和重新均衡DataNode上的數據分布:
$HADOOP_HOME/bin/start-balancer.sh -t 10%
在這個命令中,-t參數后面跟的是HDFS達到平衡狀態的磁盤使用率偏差值。如果機器與機器之間磁盤使用率偏差小於10%,那么我們就認為HDFS集群已經達到了平衡狀態。
Hadoop開發人員在開發負載均衡程序Balancer的時候,建議遵循以下幾個原則。
在執行數據重分布的過程中,必須保證數據不能出現丟失,不能改變數據的備份數,不能改變每一個機架中所具備的Block數量。
系統管理員可以通過一條命令啟動數據重分布程序或停止數據重分布程序。
Block在移動的過程中,不能占用過多的資源,如網絡帶寬。
數據重分布程序在執行的過程中,不能影響NameNode的正常工作。
HDFS數據重分布程序實現的邏輯流程,如圖3-7所示。

負載均衡程序作為一個獨立的進程與NameNode進行分開執行。從圖3-7中可以看到,HDFS負載均衡的處理步驟如下:
1)負載均衡服務Rebalancing Server從NameNode中獲取所有的DataNode情況,具體包括每一個DataNode磁盤使用情況,見圖3-7中的流程1.get datanode report。
2)Rebalancing Server計算哪些機器需要將數據移動,哪些機器可以接受移動的數據,以及從NameNode中獲取需要移動數據的分布情況,見圖3-7中的流程2.get partial blockmap。
3)Rebalancing Server計算出來可以將哪一台機器的Block移動到另一台機器中去,見圖3-7中流程3.copy a block。
4)需要移動Block的機器將數據移動到目標機器上,同時刪除自己機器上的Block數據,見圖3-7中的流程4、5、6。
5)Rebalancing Server獲取本次數據移動的執行結果,並繼續執行這個過程,一直到沒有數據可以移動或HDFS集群已經達到平衡的標准為止,見圖3-7中的流程7。
上述HDFS的這種負載均衡工作機制在絕大多數情況下都是非常適合的,然而一些特定的場景確實還是需要不同的處理方式,這里假定一種場景:
復制因子是3。
HDFS由兩個機架(rack)組成。
兩個機架中的機器磁盤配置不同,第一個機架中每一台機器的磁盤配置為2TB,第二個機架中每一台機器的磁盤配置為12TB。
大多數數據的兩份備份都存儲在第一個機架中。
在這樣的情況下,HDFS集群中的數據肯定是不平衡的,現在運行負載均衡程序,會發現運行結束以后整個HDFS集群中的數據依舊不平衡:rack1中的磁盤剩余空間遠遠小於rack2,這是因為負載均衡程序的原則是不能改變每一個機架中所具備的Block數量的。簡單地說,就是在執行負載均衡程序的時候,不會將數據從一個機架移到另一個機架中,所以就導致了負載均衡程序永遠無法平衡HDFS集群的情況。
針對於這種情況就需要HDFS系統管理員手動操作來達到負載均衡,操作步驟如下:
1)繼續使用現有的負載均衡程序,但修改機架中的機器分布,將磁盤空間小的機器部署到不同的機架中去。
2)修改負載均衡程序,允許改變每一個機架中所具有的Block數量,將磁盤空間告急的機架中存放的Block數量減少,或者將其移到其他磁盤空間富余的機架中去。來源:CUUG官網