小議Hadoop HDFS Balancer
Hadoop的HDFS集群非常容易出現(xiàn)機(jī)器與機(jī)器之間磁盤利用率不平衡的情況,比如集群中添加新的數(shù)據(jù)節(jié)點(diǎn)。當(dāng)HDFS出現(xiàn)不平衡狀況的時候,將引發(fā)很多問題,比如MR程序無法很好地利用本地計(jì)算的優(yōu)勢,機(jī)器之間無法達(dá)到更好的網(wǎng)絡(luò)帶寬使用率,機(jī)器磁盤無法利用等等。可見,保證HDFS中的數(shù)據(jù)平 衡是非常重要的。
在Hadoop中,包含一個Balancer程序,通過運(yùn)行這個程序,可以使得HDFS集群達(dá)到一個平衡的狀態(tài),使用這個程序的命令如下:
sh $HADOOP_HOME/bin/start-balancer.sh –t 10%
這個命令中-t參數(shù)后面跟的是HDFS達(dá)到平衡狀態(tài)的磁盤使用率偏差值。如果機(jī)器與機(jī)器之間磁盤使用率偏差小于10%,那么我們就認(rèn)為HDFS集群已經(jīng)達(dá)到了平衡的狀態(tài)。
Hadoop的開發(fā)人員在開發(fā)Balancer程序的時候,遵循了以下幾點(diǎn)原則:
1. 在執(zhí)行數(shù)據(jù)重分布的過程中,必須保證數(shù)據(jù)不能出現(xiàn)丟失,不能改變數(shù)據(jù)的備份數(shù),不能改變每一個rack中所具備的block數(shù)量。
2. 系統(tǒng)管理員可以通過一條命令啟動數(shù)據(jù)重分布程序或者停止數(shù)據(jù)重分布程序。
3. Block在移動的過程中,不能暫用過多的資源,如網(wǎng)絡(luò)帶寬。
4. 數(shù)據(jù)重分布程序在執(zhí)行的過程中,不能影響name node的正常工作。
基于這些基本點(diǎn),目前Hadoop數(shù)據(jù)重分布程序?qū)崿F(xiàn)的邏輯流程如下圖所示:
Rebalance程序作為一個獨(dú)立的進(jìn)程與name node進(jìn)行分開執(zhí)行。
1 Rebalance Server從Name Node中獲取所有的Data Node情況:每一個Data Node磁盤使用情況。
2 Rebalance Server計(jì)算哪些機(jī)器需要將數(shù)據(jù)移動,哪些機(jī)器可以接受移動的數(shù)據(jù)。并且從Name Node中獲取需要移動的數(shù)據(jù)分布情況。
3 Rebalance Server計(jì)算出來可以將哪一臺機(jī)器的block移動到另一臺機(jī)器中去。
4,5,6 需要移動block的機(jī)器將數(shù)據(jù)移動的目的機(jī)器上去,同時刪除自己機(jī)器上的block數(shù)據(jù)。
7 Rebalance Server獲取到本次數(shù)據(jù)移動的執(zhí)行結(jié)果,并繼續(xù)執(zhí)行這個過程,一直沒有數(shù)據(jù)可以移動或者HDFS集群以及達(dá)到了平衡的標(biāo)準(zhǔn)為止。
Hadoop現(xiàn)有的這種Balancer程序工作的方式在絕大多數(shù)情況中都是非常適合的。
現(xiàn)在我們設(shè)想這樣一種情況:
1 數(shù)據(jù)是3份備份。
2 HDFS由2個rack組成。
3 2個rack中的機(jī)器磁盤配置不同,第一個rack中每一臺機(jī)器的磁盤空間為1TB,第二個rack中每一臺機(jī)器的磁盤空間為10TB。
4 現(xiàn)在大多數(shù)數(shù)據(jù)的2份備份都存儲在第一個rack中。
在這樣的一種情況下,HDFS級群中的數(shù)據(jù)肯定是不平衡的?,F(xiàn)在我們運(yùn)行Balancer程序,但是會發(fā)現(xiàn)運(yùn)行結(jié)束以后,整個HDFS集群中的數(shù)據(jù)依舊不平衡:rack1中的磁盤剩余空間遠(yuǎn)遠(yuǎn)小于rack2。
這是因?yàn)锽alance程序的開發(fā)原則1導(dǎo)致的。
簡單的說,就是在執(zhí)行Balancer程序的時候,不會將數(shù)據(jù)中一個rack移動到另一個rack中,所以就導(dǎo)致了Balancer程序永遠(yuǎn)無法平衡HDFS集群的情況。
針對于這種情況,可以采取2中方案:
- 繼續(xù)使用現(xiàn)有的Balancer程序,但是修改rack中的機(jī)器分布。將磁盤空間小的機(jī)器分叉到不同的rack中去。
- 修改Balancer程序,允許改變每一個rack中所具備的block數(shù)量,將磁盤空間告急的rack中存放的block數(shù)量減少,或者將其移動到其他磁盤空間富余的rack中去。