漫談Hadoop HDFS Balancer

破棉襖發表於2015-03-12

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的正常工作。

基於這些基本點,目前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程式工作的方式在絕大多數情況中都是非常適合的。

現在我們設想這樣一種情況:

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中去。


CDH Balancer  : /opt/cloudera/parcels/CDH-5.0.0-1.cdh5.0.0.p0.47/bin/hdfs --config /opt/cm-5.0.0/run/cloudera-scm-agent/process/144-hdfs-BALANCER balancer -threshold 10.0 -policy DataNode
     
         144-hdfs-BALANCER目錄:
            


原文:http://www.cnblogs.com/gpcuster/archive/2011/02/16/1956555.html

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29754888/viewspace-1457032/,如需轉載,請註明出處,否則將追究法律責任。

相關文章