hadoop集群使用久了,我們會發現乙個問題,各個datanode資料不平衡了,多的達到70-80%,少的達到10-20%。面對這種場景,我們一般使用hdfs自帶的blancer工具對其資料進行平衡。也就是他只能保證每乙個節點的資料大小均衡。
但是有的時候,你會發現節點資料平衡了但是datanode內部各個磁碟塊上的資料不平衡了,這個blancer就幹不了這活兒。
比如某乙個datanode總共有a,b,c,d四塊磁碟,你用roundrobin磁碟選擇策略去寫,最後四塊磁碟都寫過了,但是a,b寫的可能就1m,c,d寫的就是100m.
一 datanode節點磁碟資料不均衡帶來的問題
1.1磁碟間資料不均衡間接導致磁碟i/o壓力不同。我們知道,hdfs上的資料訪問頻率是很高的,這就涉及到大量的讀寫磁碟操作,資料多的磁碟自然就會有更高的頻率訪問,如果一塊磁碟的io操作非常密集的話,勢必會對讀寫效能造成影響
1.2高使用率的磁碟導致節點寫資料塊的時候,可選的儲存目錄減少。
hdfs在寫block的時候,會挑選剩餘空間滿足待寫的block的大小情況下,才會進行挑選,如果高使用率磁碟目錄過多,會導致這樣的候選變少。
二 傳統的解決方案
人工移動資料塊儲存目錄:但是需要保證目錄移動的準確性,否則會造成移動完目錄後資料找不到的現象。
比如:/data/1/dfs/dn/current/bp-***xx/current/finalized/subdir0/subdir1
目標路勁:
/data/2/dfs/dn/current/bp-***xx/current/finalized/subdir0/subdir1
目錄結構就變了,current前面多了個空格,就會造成hdfs找不到這個資料塊。
三 社群解決方案diskblancer
3.1設計核心
第一:dataspread report。 資料分布式的匯報,也就是支援各個datanode匯報磁碟塊使用情況的功能,我們就可以了解到目前集群內使用率topn的節點磁碟
第二:diskblance。 進行磁碟資料平衡。但是在磁碟資料平衡的時候要考慮到各個磁碟storagetype的不同。不同的型別儲存介質可能不一樣,目前diskblancer還不支援跨儲存介質資料轉移,必須在乙個storagetype下
3.2流程分析
discover階段:
計算各個datanode磁碟使用情況,然後得到乙個需要進行資料平衡的磁碟列表,會使用volumedata density(磁碟使用密度)作為評判標準,這個標準會以節點總使用率作為比較值。比如,如果乙個datanode ,總使用率是75%,也就是0.75. 其中a盤0.5,那麼a盤的密度值就=0.75-0.5=0.25;同理如果超出的話,則密度值將會為負數。於是我們可以用volumedata density絕對值來判斷此節點內磁碟間資料平衡情況,如果總的覺得值和越大,說明資料越不平衡
plan階段:
拿到上乙個階段的匯報結果資料之後,將會生成乙個執行計畫。plan並不是乙個最小的執行單元,它是由各個step組成的,step中會指定好源磁碟,目標磁碟,這裡是結果包裝的:diskbalancervoulme,並不是原來的fsvolume.
diskbalancercluster:讀取集群節點資訊
diskbalancerdatanode:代表乙個包裝過的datanode
diskbalancervolume和 diskbalancervolumeset.datanode磁碟物件以及磁碟物件集合
execute階段:
所有執行計畫生成以後,就到了執行階段。這些計畫會被提交到各自datanode上,然後在diskbalancer類中執行。然後diskbalancer有專門的類diskbalancermover來做資料平衡工作。在磁碟間資料平衡的過程中,高使用率的磁碟會移動資料塊到相對低使用率的磁碟,等到滿足一定閾值關係的情況下時,diskbalancer會漸漸地退出.在diskbalancer的執行階段,有以下幾點需要注意:
頻寬限制:diskbalancer也可以支援頻寬限制。預設是10m,可以通
過配置項dfs.disk.balancer.max.disk.throughputinmbpersec進行控制
失敗次數限制:diskbalancer中會存在失敗次數的控制.在拷貝block資料塊的時候,出現ioexception異常,會進行失敗次數的累加計數,如果超出最大容忍值,diskbalancer也會退出.
資料平衡閥值控制:diskbalancer中可以提供乙個磁碟間資料的平衡閾值,以此作為是否需要繼續平衡資料的標準,配置項為dfs.disk.balancer.block.tolerance.percent.
四 diskbalancer的命令執行
diskbalancer內部提供了許多類別的命令操作,比如下面的查詢命令:
hdfsdiskbalancer -query nodename.mycluster.com
我們也可以執行相應的plan命令來生成plan計畫檔案.
hdfsdiskbalancer -uri hdfs: -plan node1.myclsuter.com
然後我們可以用生成好後的json檔案進行diskbalancer的執行
hdfsdiskbalancer -execute /system/diskbalancer/nodename.plan.json
當然,如果我們發現我們執行了錯誤的plan,我們也可以通過cancel命令進行清除:
hdfsdiskbalancer -cancel /system/diskbalancer/nodename.plan.json
hdfsdiskbalancer -cancel -node
HDFS集群的平衡
檔案塊在集群中均勻分布的好處 hdfs能達到最佳工作效能,乙個負載不均衡的集群可能影響mapreduce的本地化優勢,為負載搞的資料節點帶來更大的壓力。1.選用預設的每個節點20個map來執行distcp來進行資料複製,可以避免不均衡的情況。總之讓map的數量多於集群中節點的數量。2.均衡器程式是h...
HDFS集群的平衡
檔案塊在集群中均勻分布的好處 hdfs能達到最佳工作效能,乙個負載不均衡的集群可能影響mapreduce的本地化優勢,為負載搞的資料節點帶來更大的壓力。1.選用預設的每個節點20個map來執行distcp來進行資料複製,可以避免不均衡的情況。總之讓map的數量多於集群中節點的數量。2.均衡器程式是h...
HDFS集群的平衡
摘自 檔案塊在集群中均勻分布的好處 hdfs能達到最佳工作效能,乙個負載不均衡的集群可能影響mapreduce的本地化優勢,為負載搞的資料節點帶來更大的壓力。1.選用預設的每個節點20個map來執行distcp來進行資料複製,可以避免不均衡的情況。總之讓map的數量多於集群中節點的數量。2.均衡器程...