對於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次。