HDFS數據平衡

一、datanode之間的數據平衡

1.1、介紹

​ Hadoop 分佈式文件系統(Hadoop Distributed FilSystem),簡稱 HDFS,被設計成適合運行在通用硬件上的分佈式文件系統。它和現有的分佈式文件系統有很多的共同點。HDFS 是一個高容錯性的文件系統,提供高吞吐量的數據訪問,非常適合大規模數據集上的應用。HDFS 是 Apache Hadoop Core 項目一部分。
​ Hadoop的HDFS集羣非常容易出現機器與機器之間磁盤利用率不平衡的情況,比如集羣中添加新的數據節點。當HDFS出現不平衡狀況的時候,將引發很多問題,比如MR程序無法很好地利用本地計算的優勢,機器之間無法達到更好的網絡帶寬使用率,機器磁盤無法利用等等。可見,保證HDFS中的數據平衡是非常重要的

1.2、原則

  1. 在執行數據重分佈的過程中,必須保證數據不能出現丟失,不能改變數據的備份數,不能改變每一個rack中所具備的block數量。
  2. 系統管理員可以通過一條命令啓動數據重分佈程序或者停止數據重分佈程序。
  3. Block在移動的過程中,不能暫用過多的資源,如網絡帶寬。
  4. 數據重分佈程序在執行的過程中,不能影響name node的正常工作。

1.3、流程

  1. Rebalance程序作爲一個獨立的進程與name node進行分開執行。
  2. Rebalance Server從Name Node中獲取所有的Data Node情況:每一個Data Node磁盤使用情況。
  3. Rebalance Server計算哪些機器需要將數據移動,哪些機器可以接受移動的數據。並且從Name Node中獲取需要移動的數據分佈情況。
  4. Rebalance Server計算出來可以將哪一臺機器的block移動到另一臺機器中去。
  5. 需要移動block的機器將數據移動的目的機器上去,同時刪除自己機器上的block數據。
  6. 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、注意事項

  1. 默認的DataNode策略是在DataNode級別均衡存儲,但均衡器不會在DataNode的各個存儲卷之間均衡數據。
  2. 僅當DataNode使用的DFS百分比和(由集羣使用的)平均DFS之間的差大於(或小於)規定閾值時,均衡器纔會均衡DataNode。否則,它不會重新均衡集羣。
  3. 均衡器運行多長時間取決於集羣的大小和數據的不平衡程度。第一次運行均衡器,或者不經常調度均衡器,以及在添加一組DataNode之後運行均衡器,它將運行很長時間(通常是幾天,如果數據量達到PB或者接近EB級別,可能需要一個多月的時間來均衡喲~)
  4. 如果有一個數據寫入和刪除頻繁的集羣,集羣可能永遠不會達到完全均衡的狀態,均衡器僅僅將數據從一個節點移動到另一個節點。
  5. 向集羣添加新節點後最好立即運行均衡器。如果一次添加大量節點,則運行均衡器需要一段時間才能完成其工作。
  6. 如果確定閾值?這很容易,秩序選擇整個集羣中節點最低DFS使用百分比即可。不必花費大量的時間瞭解每個節點使用的DFS百分比,使用"hdfs dfsadmin -report"命令即可找出正確的閾值。閾值越小,均衡器需要執行的工作越多,集羣就越均衡。

二、節點磁盤之間的數據平衡

2.1、背景

  1. 磁盤間數據不均衡間接引發了磁盤IO壓力的不同:HDFS上的數據訪問頻率是很高的,這就會涉及到大量讀寫磁盤的操作,數據多的盤自然的就會有更高頻率的訪問操作.如果一塊盤的IO操作非常密集的話,勢必會對它的讀寫性能造成影響.
  2. 高使用率磁盤導致節點可選存儲目錄減少: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支持兩個主要功能,即報告平衡

  1. Data Spread Report.數據分佈式的彙報.這是一個report彙報的功能.也就是說,DiskBalancer工具能支持各個節點彙報磁盤塊使用情況的功能,通過這個功能我可以瞭解到目前集羣內使用率TopN的節點磁盤.
  2. 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中對磁盤節點等概念的轉化:

  1. DiskBalancerCluster:通過此對象可以,讀取到集羣中的節點信息,這裏的節點信息以DiskBalancerDataNode的方式所呈現。

  2. DiskBalancerDataNode.此對象代表的是一個包裝好後的DataNode.

  3. DiskBalancerVolume和DiskBalancerVolumeSet.DataNode磁盤對象以及磁盤對象集合.DiskBalancerVolumeSet內的磁盤存儲目錄類型需要是同種StorageType.

2.4.3、Execute

最後一部分是執行階段,所有的plan計劃生成好了之後,就到了執行階段。這些計劃會被提交到各自的DataNode上,然後在DiskBalancer類中進行執行。DiskBalancer類中有專門的類對象來做磁盤間數據平衡的工作,這個類名稱叫做DiskBalancerMover。在磁盤間數據平衡的過程中,高使用率的磁盤會移動數據塊到相對低使用率的磁盤,等到滿足一定閾值關係的情況下時,DiskBalancer會漸漸地退出。在DiskBalancer的執行階段,有以下幾點需要注意:

  1. 帶寬的限制.DiskBalancer中同樣可以支持帶寬的限制,默認是10M,通過配置項dfs.disk.balancer.max.disk.throughputInMBperSec進行控制.

  2. 失敗次數的限制.DiskBalancer中會存在失敗次數的控制.在拷貝block數據塊的時候,出現IOException異常,會進行失敗次數的累加計數,如果超出最大容忍值,DiskBalancer也會退出.

  3. 數據平衡閾值控制.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 #原理

https://zhuanlan.zhihu.com/p/303044375 #均衡命令

https://zhuanlan.zhihu.com/p/333842462 #hdfs存策略

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