hadoop中的balancer

對於HDFS集羣,經常長時間的運行,尤其是大量的delete操作後,集羣中各個Datanode上的空間使用率可能會存在比較大的差異。

所以需要一種機制使各個Datanode保持平衡,防止少數Datanode存儲過多的文件。

少數使用率過高的Datanode會導致對其的數據訪問效率變低,並且如果該Datanode掛掉,需要更多的時間進行恢復,對集羣也會造成更大的影響。

Hadoop中已經提供了balancer的機制。

hadoop balancer -threshold <threshold>

通過上面的命令可以是Hadoop對各個Datanode進行評估並使他們保持平衡。

參數threshold表示的平衡的閥值,取值範圍在0%到100%之間。

該參數表示每個Datanode中空間使用率與HDFS集羣總的空間使用率的差距百分比。

 

假如當前集羣總空間爲20T,已經空間爲10T,那麼對於HDFS集羣來說空間使用率爲50%。

當前集羣有2臺Datanode,每臺有10T總空間。

Datanode 1已用空間爲4T,那麼Datanode的空間使用率爲40%

Datanode 2已用空間爲6T,那麼Datanode的空間使用率爲60%

如果我設置balancer的閥值爲10%,那麼此時兩臺Datanode的使用率與HDFS的總使用率的比值均超過閥值,此時需要執行balancer。

如果我設置balancer的閥值爲50%,那麼此時兩臺Datanode的使用率與HDFS的總使用率的比值均未超過閥值,此時不需要執行balancer。

 

閥值設置的越小,那麼HDFS各個Datanode的使用率越接近,整個集羣也更加的平衡,但會需要消耗更多的時間和資源來達到該平衡狀態。

如果閥值設置的過小,那麼對於操作非常頻繁的HDFS集羣,有可能永遠也不會達到該閥值所指定的平衡狀態。

閥值設置的越大,那麼HDFS各個Datanode的使用率差距越大,但是會較容易達到。

 

在balancer的過程,hadoop會遞歸的把BLOCK從使用率高的Datanode轉移到那些使用率低的Datanode上。

在每次遞歸的過程中,單個Datanode轉移或者接受的BLOCK不過超過10G或者它存儲能力的閥值(根據該Datanode的總空間決定)。

並且每次遞歸過程也不能執行超過20分鐘。

在每次遞歸過後,會更新Datanode的最新狀態信息,決定下一次遞歸的執行。

 

通過參數dfs.balance.bandwidthPerSec可以現在balancer過程所佔用的網絡帶寬,單位爲每秒字節數,默認值爲1M。

如果你的集羣比較空閒或者帶寬比較大,可以適當的增加該參數,來加速整個balancer過程。

如果你的集羣比較繁忙或者帶寬比較小,就要調小該參數,但這個balancer過程會變得緩慢。

對該參數的參數,只有在HDFS下次啓動後纔可以生效。

 

整個balancer過程還是比較複雜的,首先會計算集羣總的使用率,然後分別計算各個活着的Datanode結點的使用率。

根據balancer閥值對各個Datanode進行分類,找到那些使用率過高的和使用率過低的結點。

遍歷使用率過高的結點,找到適合遷移BLOCK的目標結點,原則就是最好是同一機架,如果當前機架沒有適合的纔會考慮其他機架。

把BLOCK從使用率高的結點拷貝到使用率低的結點,完成一次遞歸過程後重新計算使用率,判斷使用需要進行下一次過程。

整個遞歸過程,最多會執行5次。


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