HADOOP HDFS BALANCER介紹及經驗總結

1.集羣執行balancer命令,依舊不平衡的原因是什麼?該如何解決?

2.儘量不在NameNode上執行start-balancer.sh的原因是什麼?

集羣平衡介紹

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

集羣執行balancer依舊不平衡的原因
基於這些基本點,目前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中去。

使用經驗總結

由於歷史原因,hadoop集羣中的機器的磁盤空間的大小各不相同,而HDFS在進行寫入操作時,並沒有考慮到這種情況,所以隨着數據量的逐漸增加,磁盤較小的datanode機器上的磁盤空間很快將被寫滿,從而觸發了報警。
此時,不得不手工執行start-balancer.sh來進行balance操作,即使將dfs.balance.bandwidthPerSec 參數設置爲10M/s,整個集羣達到平衡也需要很長的時間,所以寫了個crontab來每天凌晨來執行start-balancer.sh,由於此時集羣不平衡的狀態還沒有那麼嚴重,所以start-balancer.sh很快執行結束了。
另外需要注意的地方是,由於HDFS需要啓動單獨的Rebalance Server來執行Rebalance操作,所以儘量不要在NameNode上執行start-balancer.sh,而是找一臺比較空閒的機器。
1) hadoop balance工具的用法:

To start:  
bin/start-balancer.sh [-threshold <threshold>]  
Example: bin/ start-balancer.sh  
start the balancer with a default threshold of 10%  
bin/ start-balancer.sh -threshold 5  
start the balancer with a threshold of 5%  

To stop:  
bin/ stop-balancer.sh  

2)影響hadoop balance工具的幾個參數:
-threshold 默認設置:10,參數取值範圍:0-100,參數含義:判斷集羣是否平衡的目標參數,每一個 datanode 存儲使用率和集羣總存儲使用率的差值都應該小於這個閥值 ,理論上,該參數設置的越小,整個集羣就越平衡,但是在線上環境中,hadoop集羣在進行balance時,還在併發的進行數據的寫入和刪除,所以有可能無法到達設定的平衡參數值。
dfs.balance.bandwidthPerSec 默認設置:1048576(1 M/S),參數含義:設置balance工具在運行中所能佔用的帶寬,設置的過大可能會造成mapred運行緩慢

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章