這篇文章是從網上看到的,覺得很好就收藏了,但是最終不知道出處了。
hadoop的hdfs叢集非常容易出現機器與機器之間磁盤使用率不平衡的情況,比如叢集中添加新的資料節點。當hdfs出現不平衡狀況的時候,将引發很多問題,比如mr程式無法很好地利用本地計算的優勢,機器之間無法達到更好的網絡帶寬使用率,機器磁盤無法利用等等。可見,保證hdfs中的資料平衡是非常重要的。
在hadoop中,包含一個balancer程式,通過運作這個程式,可以使得hdfs叢集達到一個平衡的狀态,使用這個程式的指令如下:
這個指令中-t參數後面跟的是hdfs達到平衡狀态的磁盤使用率偏內插補點。如果機器與機器之間磁盤使用率偏差小于10%,那麼我們就認為hdfs叢集已經達到了平衡的狀态。
<b>hadoop的開發人員在開發balancer程式的時候,遵循了以下幾點原則:</b>
1.在執行資料重分布的過程中,必須保證資料不能出現丢失,不能改變資料的備份數,不能改變每一個rack中所具備的block數量。
2.系統管理者可以通過一條指令啟動資料重分布程式或者停止資料重分布程式。
3.block在移動的過程中,不能暫用過多的資源,如網絡帶寬。
4.資料重分布程式在執行的過程中,不能影響name node的正常工作。
<b>基于這些基本點,目前hadoop資料重分布程式實作的邏輯流程如下圖所示:</b>

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程式工作的方式在絕大多數情況中都是非常适合的。
<b>現在我們設想這樣一種情況:</b>
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中去。