HDFS Balancer流程(下)

均衡操作依靠一個均衡操作服務器、NameNode的代理和DataNode來實現,其邏輯流程如下:


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


其中,


Step1:Balance Server從Name Node中獲取所有的Data Node情況,即每一個Data Node磁盤使用情況;


Step2: Balance Server計算哪些Dataode節點需要將數據移動,哪些Dataode節點可以接受移動的塊數據,並且從NameNode中獲取需要移動的數據分佈情況;


Step3: Balance Server計算出來可以將哪一臺Dataode節點的block移動到另一臺機器中去;


Step4、5、6:需要移動block的DataNode節點將數據移動到目標DataNode節點上去,同時刪除自己節點上的block數據;


Step7: Balance Server獲取到本次數據移動的執行結果,並繼續執行這個過程(稱爲迭代),一直到沒有數據可以移動或者HDFS集羣以及達到了平衡的標準爲止。


1DataNode節點分析


代碼


640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=


流程


initNodes計算所有活着的且正常服務的dn節點對應的磁盤利用率以及集羣平均的磁盤利用率,計算待移動的字節數,並且會根據當前的DataNode的磁盤使用率和閾值將所有的DataNode區分爲如下四種類型:


(1)over組:此組中的DataNode的均滿足

DataNode_usedSpace_percent  > Cluster_usedSpace_percent+ threshold;


(2)above組:此組中的DataNode的均滿足

Cluster_usedSpace_percent +threshold > DataNode_ usedSpace_percent  > Cluster_usedSpace_percent;


(3)below組:此組中的DataNode的均滿足

Cluster_usedSpace_percent >DataNode_ usedSpace_percent  > Cluster_ usedSpace_percent –threshold;


(4)under組:此組中的DataNode的均滿足

Cluster_usedSpace_percent –threshold > DataNode_usedSpace_percent;


用一個示例圖表示:



2Balancer移動對選擇


代碼




流程


對於上一節中提到的根據DataNode的磁盤使用率和閾值區分的四種類型,Balancer處理最上面和最下面的兩個區域,對於位於Cluster_usedSpace_percent - threshold ~ Cluster_usedSpace_percent+ threshold間的DataNode認爲已經是平衡的。threshold可以在啓動時通過-thresld參數設置,默認爲10.0%,如下圖:



最終,將Balancer的移動對選擇出來,如下分爲Source和Target:

Source ={overUtilizedDatanodes,aboveAvgUtilizedDatanodes}    Target = {belowAvgUtilizedDatanodes,underUtilizedDatanodes}


將Source對應的DataNode中的數據移動到Target對應的DataNode中,如下圖:



優化


在形成Balancer移動對中,每一對可以移動的字節數也同時被計算出,計算的代碼列舉如下:




上面代碼加亮的部分顯示了迭代中移動字節數的計算,首先,單個DataNode會根據上面提到的分類,計算其一次迭代中最大可以移動(移入或移出)的大小,如下圖:



對於over和under區域的DataNode,每個迭代最大移動的大小爲threshold * DataNode的容量(當然,使用率低於集羣平均使用率的DataNode每個迭代最大移動的大小還要取threshold * DataNode的容量和DataNode的剩餘容量中小的那一個),即每個迭代移動結束,並不一定保證over和under區域的DataNode一定平衡。


對於above和below區域的DataNode,每個迭代最大移動的大小爲Math.abs(avgUtil-utilization)*DataNode的容量,即每個迭代移動結束,這兩個區域的DataNode依然處於平衡狀態。


最後,根據上述原則計算出的移動字節大小,還要和MAX_SIZE_TO_MOVE比較,兩者取小,因而,增大MAX_SIZE_TO_MOVE的取值也有利於提升單次迭代的移動量,從而減少迭代次數,提升Balancer速度,但顯然,該值是次要影響因素,因爲需要從兩個值中選取小的。


3塊移動


代碼


針對匹配好的<source,target>移動對,創建一個線程,加入dispatcherExecutor中,主要遷移工作代碼邏輯如下:




流程


上述代碼中,BlockMoveDispatcher調用了dispatchBlocks函數,該函數完成主要遷移工作,其流程圖見下:



優化


上一節的流程圖中,帶陰影的“進行塊移動”涉及DataNode的OP_REPLACE_BLOCK操作,具體如下:Balancer會向相關的目標DataNode節點發出一個OP_REPLACE_BLOCK 消息,接收到這個消息的DataNode節點,會將從源DataNode節點傳輸來的數據塊寫入本地,寫成功後,通知NameNode,刪除源DataNode上的同一個數據塊。


其代碼摘錄如下:




這裏涉及的網絡帶寬和並行度,直接影響balance的速度,是主要因素,ZDH提供按需動態配置,配置方法見本公衆號上期文章。


4迭代


代碼




流程


一次迭代之後,會根據返回值,確認是否再進行下一輪迭代,兩次迭代間進行休眠,休眠時間缺省爲6秒。


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