一、datanode之間的資料平衡
1.1、介紹
Hadoop 分散式檔案系統(Hadoop Distributed FilSystem),簡稱 HDFS,被設計成適合執行在通用硬體上的分散式檔案系統。它和現有的分散式檔案系統有很多的共同點。HDFS 是一個高容錯性的檔案系統,提供高吞吐量的資料訪問,非常適合大規模資料集上的應用。HDFS 是 Apache Hadoop Core 專案一部分。
Hadoop的HDFS叢集非常容易出現機器與機器之間磁碟利用率不平衡的情況,比如叢集中新增新的資料節點。當HDFS出現不平衡狀況的時候,將引發很多問題,比如MR程式無法很好地利用本地計算的優勢,機器之間無法達到更好的網路頻寬使用率,機器磁碟無法利用等等。可見,保證HDFS中的資料平衡是非常重要的
1.2、原則
- 在執行資料重分佈的過程中,必須保證資料不能出現丟失,不能改變資料的備份數,不能改變每一個rack中所具備的block數量。
- 系統管理員可以通過一條命令啟動資料重分佈程式或者停止資料重分佈程式。
- Block在移動的過程中,不能暫用過多的資源,如網路頻寬。
- 資料重分佈程式在執行的過程中,不能影響name node的正常工作。
1.3、流程
- Rebalance程式作為一個獨立的程式與name node進行分開執行。
- Rebalance Server從Name Node中獲取所有的Data Node情況:每一個Data Node磁碟使用情況。
- Rebalance Server計算哪些機器需要將資料移動,哪些機器可以接受移動的資料。並且從Name Node中獲取需要移動的資料分佈情況。
- Rebalance Server計算出來可以將哪一臺機器的block移動到另一臺機器中去。
- 需要移動block的機器將資料移動的目的機器上去,同時刪除自己機器上的block資料。
- Rebalance Server獲取到本次資料移動的執行結果,並繼續執行這個過程,一直沒有資料可以移動或者HDFS叢集以及達到了平衡的標準為止
步驟1:Rebalance Server從NameNode中獲取所有的DataNode情況:每一個DataNode磁碟使用情況。
步驟2:Rebalance Server計算哪些機器需要將資料移動,哪些機器可以接受移動的資料。並且從NameNode中獲取需要移動的資料分佈情況。
步驟3:Rebalance Server計算出來可以將哪一臺機器的block移動到另一臺機器中去。
步驟4,5,6:需要移動block的機器將資料移動的目的機器上去,同時刪除自己機器上的block資料。
步驟7:Rebalance Server獲取到本次資料移動的執行結果,並繼續執行這個過程,一直沒有資料可以移動或者HDFS叢集以及達到了平衡的標準為止
Balancer退出條件:
-
* The cluster is balanced; * No block can be moved; * No block has been moved for specified consecutive iterations (5 by default); * An IOException occurs while communicating with the namenode; * Another balancer is running 指令碼自動退出條件 叢集內資料已經達到平衡條件了。 沒有資料塊可以被移動。 連續三次迭代中都沒有資料塊移動。 NameNode 互動失敗; 另外已經有資料平衡程式啟動
1.4、使用命令
hdfs balancer -help Usage: java Balancer [-policy <policy>] the balancing policy: datanode or blockpool [-threshold <threshold>] Percentage of disk capacity [-exclude [-f <hosts-file> | comma-sperated list of hosts]] Excludes the specified datanodes. [-include [-f <hosts-file> | comma-sperated list of hosts]] Includes only the specified datanodes.
-threshold:某datanode的使用率和整個叢集使用率的百分比差值閾值,達到這個閾值就啟動hdfs balancer,取值從1到100,不宜太小,因為在平衡過程中也有資料寫入,太小無法達到平衡
-policy:分為blockpool和datanode,前者是block pool級別的平衡後者是datanode級別的平衡,BlockPool 策略平衡了塊池級別和 DataNode 級別的儲存。BlockPool 策略僅適用於 Federated HDFS 服務
-exclude:不為空,則不在這些機器上進行平衡
-include:不為空,則僅在這些機器上進行平衡
-idleiterations:最大迭代次數
1.5、引數調整
dfs.datanode.balance.bandwidthPerSec = 31457280 ,指定DataNode用於balancer的頻寬為30MB,這個示情況而定,如果交換機效能好點的,完全可以設定為50MB,單位是Byte,如果機器的網路卡和交換機的頻寬有限,可以適當降低該速度,預設是1048576(1MB),hdfs dfsadmin-setBalancerBandwidth 52428800可以通過命令設定
-threshold:預設設定為10,引數取值範圍0-100,引數含義:判斷叢集是否平衡的目標引數,每一個 datanode 儲存使用率和叢集總儲存使用率的差值都應該小於這個閥值 ,理論上,該引數設定的越小,整個叢集就越平衡,但是線上上環境中,hadoop叢集在進行balance時,還在併發的進行資料的寫入和刪除,所以有可能無法到達設定的平衡引數值
dfs.datanode.balance.max.concurrent.moves = 50,指定DataNode上同時用於balance待移動block的最大執行緒個數
dfs.balancer.moverThreads:用於執行block移動的執行緒池大小,預設1000
dfs.balancer.max-size-to-move:每次balance進行迭代的過程最大移動資料量,預設10737418240(10GB)
dfs.balancer.getBlocks.size:獲取block的數量,預設2147483648(2GB)
dfs.balancer.getBlocks.minblock-size:用來平衡的最小block大小,預設10485760(10MB)
dfs.datanode.max.transfer.threads:建議為16384),指定用於在DataNode間傳輸block資料的最大執行緒數
dfs.namenode.replication.max-streams:
頻寬即為平衡過程中的頻寬速率 引數為dfs.datanode.balance.bandwidthPerSec 一般預設10M/s
命令:hdfs dfsadmin -setBalancerBandwidth newbandwidth
其中newbandwidth是每個DataNode在平衡操作期間可以使用的最大網路頻寬量,以每秒位元組數為單位
比如:hdfs dfsadmin -setBalancerBandwidth 104857600
hdfs balancer -Ddfs.balancer.block-move.timeout=600000 //預設相差值為10% 頻寬速率為10M/s
過程資訊會直接列印在客戶端 ctrl+c即可中止
#可以手動設定相差值 一般相差值越小 需要平衡的時間就越長
hdfs balancer -threshold 20 //設定為20% 這個引數本身就是百分比 不用帶%
#如果怕影響業務可以動態設定一下頻寬再執行上述命令
hdfs dfsadmin -setBalancerBandwidth 1048576 // 1M/s
#或者直接帶參執行
hdfs balancer -Ddfs.datanode.balance.bandwidthPerSec=1048576 -Ddfs.balancer.block-move.timeout=600000
//頻寬為1M/s
1.6、注意事項
- 預設的DataNode策略是在DataNode級別均衡儲存,但均衡器不會在DataNode的各個儲存卷之間均衡資料。
- 僅當DataNode使用的DFS百分比和(由叢集使用的)平均DFS之間的差大於(或小於)規定閾值時,均衡器才會均衡DataNode。否則,它不會重新均衡叢集。
- 均衡器執行多長時間取決於叢集的大小和資料的不平衡程度。第一次執行均衡器,或者不經常排程均衡器,以及在新增一組DataNode之後執行均衡器,它將執行很長時間(通常是幾天,如果資料量達到PB或者接近EB級別,可能需要一個多月的時間來均衡喲~)
- 如果有一個資料寫入和刪除頻繁的叢集,叢集可能永遠不會達到完全均衡的狀態,均衡器僅僅將資料從一個節點移動到另一個節點。
- 向叢集新增新節點後最好立即執行均衡器。如果一次新增大量節點,則執行均衡器需要一段時間才能完成其工作。
- 如果確定閾值?這很容易,秩序選擇整個叢集中節點最低DFS使用百分比即可。不必花費大量的時間瞭解每個節點使用的DFS百分比,使用"hdfs dfsadmin -report"命令即可找出正確的閾值。閾值越小,均衡器需要執行的工作越多,叢集就越均衡。
二、節點磁碟之間的資料平衡
2.1、背景
- 磁碟間資料不均衡間接引發了磁碟IO壓力的不同:HDFS上的資料訪問頻率是很高的,這就會涉及到大量讀寫磁碟的操作,資料多的盤自然的就會有更高頻率的訪問操作.如果一塊盤的IO操作非常密集的話,勢必會對它的讀寫效能造成影響.
- 高使用率磁碟導致節點可選儲存目錄減少:HDFS在寫Block資料的時候,會挑選剩餘可用空間滿足待寫Block的大小的情況下時,才會進行挑選,如果高使用率磁碟目錄過多,會導致這樣的候選塊變少.所以這方面其實偏向的是對HDFS的影響
當寫入新block時,DataNodes將根據選擇策略(迴圈策略或可用空間策略)來選擇block的磁碟(卷)。
-
迴圈策略:它將新block均勻分佈在可用磁碟上。預設此策略。
-
可用空間策略:此策略將資料寫入具有更多可用空間(按百分比)的磁碟。
但是,在長期執行的群集中採用迴圈策略時,DataNode有時會不均勻地填充其儲存目錄(磁碟/卷),從而導致某些磁碟已滿而其他磁碟卻很少使用的情況。發生這種情況的原因可能是由於大量的寫入和刪除操作,也可能是由於更換了磁碟。
另外,如果我們使用基於可用空間的選擇策略,則每個新寫入將進入新新增的空磁碟,從而使該期間的其他磁碟處於空閒狀態。這將在新磁碟上建立瓶頸。
因此,需要一種Intra DataNode Balancing(DataNode內資料塊的均勻分佈)來解決Intra-DataNode偏斜(磁碟上塊的不均勻分佈),這種偏斜是由於磁碟更換或隨機寫入和刪除而發生的。
2.2、介紹
HDFS disk balancer是Hadoop 3中引入的命令列工具,用於平衡DataNode中的資料在磁碟之間分佈不均勻問題。 這裡要特別注意,HDFS disk balancer與HDFS Balancer是不同的:
-
HDFS disk balancer針對給定的DataNode進行操作,並將塊從一個磁碟移動到另一個磁碟,是DataNode內部資料在不同磁碟間平衡;
-
HDFS Balancer平衡了DataNode節點之間的分佈。
2.3、設計目標
HDFS Disk balancer支援兩個主要功能,即報告和平衡。
- Data Spread Report.資料分散式的彙報.這是一個report彙報的功能.也就是說,DiskBalancer工具能支援各個節點彙報磁碟塊使用情況的功能,通過這個功能我可以瞭解到目前叢集內使用率TopN的節點磁碟.
- Disk Balancing.第二點才是磁碟資料的平衡.但是在磁碟內資料平衡的時候,要考慮到各個磁碟storageType的不同,因為之前提到過HDFS的異構儲存,不同盤可能儲存介質會不同,目前DiskBalancer不支援跨儲存介質的資料轉移,所以目前都是要求在一個storageType下的.
2.3.1資料傳播報告
為了定義一種方法來衡量叢集中哪些計算機遭受資料分佈不均的影響,HDFS磁碟平衡器定義了HDFS Volume Data Density metric(卷/磁碟資料密度度量標準)和Node Data Density metric(節點資料密度度量標準)。
-
HDFS卷資料密度度量標準能夠比較資料在給定節點的不同捲上的分佈情況。
-
節點資料密度度量允許在節點之間進行比較。
Volume data density metric計算過程:
假設有一臺具有四個卷/磁碟的計算機-Disk1,Disk2,Disk3,Disk4,各個磁碟使用情況:
Disk1 | Disk2 | Disk3 | Disk4 | |
---|---|---|---|---|
capacity | 200 GB | 300 GB | 350 GB | 500 GB |
dfsUsed | 100 GB | 76 GB | 300 GB | 475 GB |
dfsUsedRatio | 0.5 | 0.25 | 0.85 | 0.95 |
volumeDataDensity | 0.20 | 0.45 | -0.15 | -0.24 |
Total capacity= 200 + 300 + 350 + 500 = 1350 GB
Total Used= 100 + 76 + 300 + 475 = 951 GB
因此,每個卷/磁碟上的理想儲存為:
Ideal storage = total Used ÷ total capacity= 951÷1350 = 0.70
也就是每個磁碟應該保持在 70%理想儲存容量。
VolumeDataDensity = idealStorage – dfs Used Ratio
比如Disk1的卷資料密度= 0.70-0.50 = 0.20。其他Disk以此類推。
volumeDataDensity的正值表示磁碟未充分利用,而負值表示磁碟相對於當前理想儲存目標的利用率過高。
Node Data Density計算過程:
Node Data Density(節點資料密度)= 該節點上所有卷/磁碟volume data density絕對值的總和。
上述例子中的節點資料密度=|0.20|+|0.45|+|-0.15|+|-0.24| =1.04
較低的node Data Density值表示該機器節點具有較好的擴充套件性,而較高的值表示節點具有更傾斜的資料分佈。
一旦有了volumeDataDensity和nodeDataDensity,就可以找到叢集中資料分佈傾斜的節點,或者可以獲取給定節點的volumeDataDensity。
一旦有了volumeDataDensity和nodeDataDensity,就可以找到叢集中資料分佈傾斜的節點,或者可以獲取給定節點的volumeDataDensity。
2.4、架構
DiskBalancer的架構設計.DiskBalancer的核心架構思想分為三個部分
2.4.1、Discover
通過計算各個節點內的磁碟使用情況,然後得出需要資料平衡的磁碟列表。這裡會通過Volume Data Density(磁碟使用密度)的概念作為一個評判的標準,這個標準值將會以節點總使用率作為比較值。舉個例子,如果一個節點,總使用率為75%,就是0.75。其中A盤使用率0.5(50%),那麼A盤的volumeDataDensity密度值就等於0.75-0.5=0.25。同理,如果超出的話,則密度值將會為負數。於是我們可以用節點內各個盤的volumeDataDensity的絕對值來判斷此節點內磁碟間資料的平衡情況,如果總的絕對值的和越大,說明資料越不平衡,這有點類似於方差的概念。Discover階段將會用到如下的聯結器物件:
DBNameNodeConnector
sonConnector
NullConnector
其中第一個物件會呼叫到Balancer包下NameNodeConnector物件,以此來讀取叢集節點,磁碟資料情況
2.4.2、Plan
拿到上一階段的彙報結果資料之後,將會進行執行計劃的生成。Plan並不是一個最小的執行單元,它的內部由各個Step組成,Step中會指定好源,目標磁碟。這裡的磁碟物件是一層經過包裝的物件:DiskBalancerVolume,並不是原來的FsVolume。這裡順便提一下DiskBalancer中對磁碟節點等概念的轉化:
-
DiskBalancerCluster:通過此物件可以,讀取到叢集中的節點資訊,這裡的節點資訊以DiskBalancerDataNode的方式所呈現。
-
DiskBalancerDataNode.此物件代表的是一個包裝好後的DataNode.
-
DiskBalancerVolume和DiskBalancerVolumeSet.DataNode磁碟物件以及磁碟物件集合.DiskBalancerVolumeSet內的磁碟儲存目錄型別需要是同種StorageType.
2.4.3、Execute
最後一部分是執行階段,所有的plan計劃生成好了之後,就到了執行階段。這些計劃會被提交到各自的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.
2.5、相關命令
2.5.1、plan命令
預設情況下,Hadoop群集上已經啟用了Disk Balancer功能。通過在hdfs-site.xml中調整dfs.disk.balancer.enabled引數值為true,選擇在Hadoop中是否啟用磁碟平衡器。
命令:hdfs diskbalancer -plan
-out //控制計劃檔案的輸出位置
-bandwidth //設定用於執行Disk Balancer的最大頻寬。預設頻寬10 MB/s。
–thresholdPercentage //定義磁碟開始參與資料重新分配或平衡操作的值。預設的thresholdPercentage值為10%,這意味著僅當磁碟包含的資料比理想儲存值多10%或更少時,磁碟才用於平衡操作。
-maxerror //它允許使用者在中止移動步驟之前為兩個磁碟之間的移動操作指定要忽略的錯誤數。
-v //詳細模式,指定此選項將強制plan命令在stdout上顯示計劃的摘要。
-fs //此選項指定要使用的NameNode。如果未指定,則Disk Balancer將使用配置中的預設NameNode。
2.5.2、Excute命令
命令:hdfs diskbalancer -execute
execute命令針對為其生成計劃的DataNode執行計劃。
2.5.3、查詢命令
命令:hdfs diskbalancer -query
query命令從執行計劃的DataNode獲取HDFS磁碟平衡器的當前狀態。
2.5.4、取消命令
命令:hdfs diskbalancer -cancel
hdfs diskbalancer -cancel planID node
cancel命令取消執行計劃。
2.5.5、彙報命令
命令:hdfs diskbalancer -fs https://namenode.uri -report <file://>
三、參考地址
https://blog.csdn.net/nothair/article/details/114271275
https://www.cnblogs.com/yinzhengjie2020/p/13342039.html
https://blog.51cto.com/u_12445535/2354958 #balancer命令
https://www.jianshu.com/p/f7c1cd476601 #原始碼分析
https://www.cnblogs.com/hit-zb/p/11939161.html #同上
https://zhuanlan.zhihu.com/p/340472799 #hdfs命令
https://cloud.tencent.com/developer/article/1557887 #原理