HDFS數據均衡篇
node
做者:尹正傑服務器
版權聲明:原創做品,謝絕轉載!不然將追究法律責任。網絡
一.HDFS數據均衡概述app
隨着時間的推移,HDFS存儲中數據分佈可能變得不平衡,某些DataNode上可能具備更多的數據塊。在極端的狀況下,在具備更多的節點上讀取和寫入過於頻繁,而一些較少的節點則未被充分利用。
當向集羣添加新節點時,HDFS的數據分佈也會失去平衡。Hadoop不會自動移動現有數據到新節點,以均衡集羣Datanode中的數據分佈。它只是開始使用新的DataNode來存儲新數據。
Hadoop不尋求實現徹底均衡的集羣。在具備連續數據流的集羣中,這種狀態很難實現。相反,當每一個Datanode上的空間使用率與Hadoop集羣總的空間使用率的差值小於特定百分比時,Hadoop認爲集羣是均衡的。此外,它還利用閾值爲數據均衡提供靈活性。
Hadoop提供了一個有用的工具,即均衡器,使用它可以從新均衡集羣的快分佈,所以全部DataNode都存儲大體相等的數據量。
舒適提示:
在集羣中按期運行HDFS均衡器是一個很好的作法。
二.HDFS數據不均衡的緣由ide
HDFS不能保證在集羣中的DataNode之間均勻分配數據。例如,當向集羣添加新節點時,全部新塊均可以分配給該節點,從而使數據分佈不均衡。
當Namenode將數據塊分配給Datanode時,它執行如下標準來決定哪些DataNode得到新的塊:
(1)在集羣的DataNode上統一分佈數據;
(2)正在寫該塊的節點保留數據塊的一個副本;
(3)將其中一個副本放置在與寫入塊節點相同的機架上,以最小化跨機架網絡I/O;
(4)將副本跨機架進行復制,以支持冗餘並在整個機架丟失後繼續運行;
當給定Datanode中的空間百分比越高於或低於該集羣中Datanode所使用的平均空間百分比時,Hadoop會認爲集羣時均衡的。這個"略高於或者略低於"的標準有參數閾值定義。
三.運行均衡器以均衡HDFS數據工具
1>.HDFS均衡器原理oop
HDFS均衡器是Hadoop提供的工具,使用該工具能夠從過分使用的DataNodes移動數據塊到利用不足的Datanode,從而均衡集羣的DataNode數據。
HDFS均衡器的原理以下圖所示,最初Rack 1和Rack 2有數據塊。新的機架(Rack 3)沒有數據,並且只有新添加的數據才被放置在那裏。
這意味着添加節點致使集羣數據不均衡。須要將現有DataNode的數據移動到新的沒有數據的DataNode(或者添加新數據時將數據直接寫入到新節點)。
當運行均衡器時,Hadoop將數據塊從現有位置移動到具備更多自由空間的節點,最終全部節點具備大體相同的空間使用率。
2>.運行均衡器的方式測試
能夠經過"start-balancer.sh"腳本調用均衡器,也能夠經過執行命令"hdfs balancer"來運行均衡器。下面是balancer命令的用法:
[root@hadoop101.yinzhengjie.com ~]# hdfs balancer --help Usage: hdfs balancer [-policy <policy>] the balancing policy: datanode or blockpool [-threshold <threshold>] Percentage of disk capacity [-exclude [-f <hosts-file> | <comma-separated list of hosts>]] Excludes the specified datanodes. [-include [-f <hosts-file> | <comma-separated list of hosts>]] Includes only the specified datanodes. [-source [-f <hosts-file> | <comma-separated list of hosts>]] Pick only the specified datanodes as source nodes. [-blockpools <comma-separated list of blockpool ids>] The balancer will only run on blockpools included in this list. [-idleiterations <idleiterations>] Number of consecutive idle iterations (-1 for Infinite) before exit. [-runDuringUpgrade] Whether to run the balancer during an ongoing HDFS upgrade.This is usually not desired since it will not affect used space on over-utilized machines. Generic options supported are: -conf <configuration file> specify an application configuration file -D <property=value> define a value for a given property -fs <file:///|hdfs://namenode:port> specify default filesystem URL to use, overrides 'fs.defaultFS' property from configurations. -jt <local|resourcemanager:port> specify a ResourceManager -files <file1,...> specify a comma-separated list of files to be copied to the map reduce cluster -libjars <jar1,...> specify a comma-separated list of jar files to be included in the classpath -archives <archive1,...> specify a comma-separated list of archives to be unarchived on the compute machines The general command line syntax is: command [genericOptions] [commandOptions] [root@hadoop101.yinzhengjie.com ~]#
3>.爲均衡器設置適當的閾值this
threshold參數表示每一個DataNode的HDFS使用率於集羣的平均DFS利用率的誤差百分比。以任意一方式(更高或更低)超過該閾值將意味着該節點會被從新均衡。
以下面的案例所示,能夠運行不帶任何參數的balancer命令,則此均衡器明朗了使用10%的默認閾值,這意味着均衡器經過將塊從過分使用的節點移動到未充分使用的節點來均衡數據,直到每一個Datanode的磁盤使用率不超過集羣中平均磁盤使用率的正負10%。 有時,可能但願將閾值設置爲不一樣的級別,例如,當集羣中的可用空間變小,而且你但願將單個DataNode上使用的存儲量保持在比默認的10%閾值更小的範圍內時,能夠這樣指定閾值"hdfs balancer -threshold 5"
當運行均衡器時,它會查看集羣中的兩個關鍵HDFS使用狀況值:
(1)平均DFS使用百分比:
能夠經過計算獲得集羣中使用的平均DFS百分比:"Average DFS Used = (DFS Used * 100) / Present Capacity"
(2)節點使用的DFS百分比:
此度量顯示每一個節點使用的DFS百分比。
[root@hadoop101.yinzhengjie.com ~]# hdfs balancer #運行均衡器若不帶任何參數的balancer命令,則使用默認閾值(10%)。 20/08/20 18:59:50 INFO balancer.Balancer: namenodes = [hdfs://hadoop101.yinzhengjie.com:9000] 20/08/20 18:59:50 INFO balancer.Balancer: parameters = Balancer.BalancerParameters [BalancingPolicy.Node, threshold = 10.0, max idle iteration = 5, #excluded nodes = 0, #included nodes = 0, #source nodes = 0, #blockpools = 0, run during upgrade = false]20/08/20 18:59:50 INFO balancer.Balancer: included nodes = [] 20/08/20 18:59:50 INFO balancer.Balancer: excluded nodes = [] 20/08/20 18:59:50 INFO balancer.Balancer: source nodes = [] Time Stamp Iteration# Bytes Already Moved Bytes Left To Move Bytes Being Moved 20/08/20 18:59:51 INFO balancer.Balancer: dfs.balancer.movedWinWidth = 5400000 (default=5400000) 20/08/20 18:59:51 INFO balancer.Balancer: dfs.balancer.moverThreads = 1000 (default=1000) 20/08/20 18:59:51 INFO balancer.Balancer: dfs.balancer.dispatcherThreads = 200 (default=200) 20/08/20 18:59:51 INFO balancer.Balancer: dfs.datanode.balance.max.concurrent.moves = 50 (default=50) 20/08/20 18:59:51 INFO balancer.Balancer: dfs.balancer.getBlocks.size = 2147483648 (default=2147483648) 20/08/20 18:59:51 INFO balancer.Balancer: dfs.balancer.getBlocks.min-block-size = 10485760 (default=10485760) 20/08/20 18:59:51 INFO balancer.Balancer: dfs.balancer.max-size-to-move = 10737418240 (default=10737418240) 20/08/20 18:59:51 INFO balancer.Balancer: dfs.blocksize = 536870912 (default=134217728) 20/08/20 18:59:51 INFO net.NetworkTopology: Adding a new node: /rack001/172.200.6.102:50010 20/08/20 18:59:51 INFO net.NetworkTopology: Adding a new node: /rack002/172.200.6.104:50010 20/08/20 18:59:51 INFO net.NetworkTopology: Adding a new node: /rack002/172.200.6.103:50010 20/08/20 18:59:51 INFO balancer.Balancer: 0 over-utilized: [] 20/08/20 18:59:51 INFO balancer.Balancer: 0 underutilized: [] The cluster is balanced. Exiting... Aug 20, 2020 6:59:51 PM 0 0 B 0 B 0 B Aug 20, 2020 6:59:51 PM Balancing took 764.0 milliseconds [root@hadoop101.yinzhengjie.com ~]#
[root@hadoop101.yinzhengjie.com ~]# hdfs balancer -threshold 5 #個人集羣相對較小,並且並無大量使用,所以儘管我設置的百分比很小,依舊沒有觸發數據均衡。 20/08/20 19:20:57 INFO balancer.Balancer: Using a threshold of 5.0 20/08/20 19:20:57 INFO balancer.Balancer: namenodes = [hdfs://hadoop101.yinzhengjie.com:9000] 20/08/20 19:20:57 INFO balancer.Balancer: parameters = Balancer.BalancerParameters [BalancingPolicy.Node, threshold = 5.0, max idle iteration = 5, #excluded nodes = 0, #included nodes = 0, #source nodes = 0, #blockpools = 0, run during upgrade = false]20/08/20 19:20:57 INFO balancer.Balancer: included nodes = [] 20/08/20 19:20:57 INFO balancer.Balancer: excluded nodes = [] 20/08/20 19:20:57 INFO balancer.Balancer: source nodes = [] Time Stamp Iteration# Bytes Already Moved Bytes Left To Move Bytes Being Moved 20/08/20 19:20:58 INFO balancer.Balancer: dfs.balancer.movedWinWidth = 5400000 (default=5400000) 20/08/20 19:20:58 INFO balancer.Balancer: dfs.balancer.moverThreads = 1000 (default=1000) 20/08/20 19:20:58 INFO balancer.Balancer: dfs.balancer.dispatcherThreads = 200 (default=200) 20/08/20 19:20:58 INFO balancer.Balancer: dfs.datanode.balance.max.concurrent.moves = 50 (default=50) 20/08/20 19:20:58 INFO balancer.Balancer: dfs.balancer.getBlocks.size = 2147483648 (default=2147483648) 20/08/20 19:20:58 INFO balancer.Balancer: dfs.balancer.getBlocks.min-block-size = 10485760 (default=10485760) 20/08/20 19:20:58 INFO balancer.Balancer: dfs.balancer.max-size-to-move = 10737418240 (default=10737418240) 20/08/20 19:20:58 INFO balancer.Balancer: dfs.blocksize = 536870912 (default=134217728) 20/08/20 19:20:58 INFO net.NetworkTopology: Adding a new node: /rack001/172.200.6.102:50010 20/08/20 19:20:58 INFO net.NetworkTopology: Adding a new node: /rack002/172.200.6.103:50010 20/08/20 19:20:58 INFO net.NetworkTopology: Adding a new node: /rack002/172.200.6.104:50010 20/08/20 19:20:58 INFO balancer.Balancer: 0 over-utilized: [] 20/08/20 19:20:58 INFO balancer.Balancer: 0 underutilized: [] The cluster is balanced. Exiting... Aug 20, 2020 7:20:58 PM 0 0 B 0 B 0 B Aug 20, 2020 7:20:58 PM Balancing took 750.0 milliseconds [root@hadoop101.yinzhengjie.com ~]#
[root@hadoop101.yinzhengjie.com ~]# ll -h total 374M -rw-r--r-- 1 root root 374M Aug 10 15:42 hadoop-2.10.0.tar.gz [root@hadoop101.yinzhengjie.com ~]# [root@hadoop101.yinzhengjie.com ~]# nohup hdfs balancer -threshold 5 > ~/ballancer-stdout.log 2> ~/ballancer-stderr.log & #生產環境建議搭建讓均衡器後臺執行 [1] 9066 [root@hadoop101.yinzhengjie.com ~]# [root@hadoop101.yinzhengjie.com ~]# jobs #經過jobs命令能夠查看到後臺任務,我使用的是測試集羣,所以很快就執行完畢啦~(目的是爲你們展現使用方式) [1]+ Done nohup hdfs balancer -threshold 5 > ~/ballancer-stdout.log 2> ~/ballancer-stderr.log [root@hadoop101.yinzhengjie.com ~]# [root@hadoop101.yinzhengjie.com ~]# [root@hadoop101.yinzhengjie.com ~]# ll #能夠經過查看日誌來判斷當前集羣是否處於均衡狀態,亦或者均衡器中止運行說明集羣已處於均衡狀態啦~ total 382936 -rw-r--r-- 1 root root 1813 Aug 20 19:26 ballancer-stderr.log -rw-r--r-- 1 root root 287 Aug 20 19:26 ballancer-stdout.log -rw-r--r-- 1 root root 392115733 Aug 10 15:42 hadoop-2.10.0.tar.gz [root@hadoop101.yinzhengjie.com ~]#
4>.調整均衡器的帶寬spa
在理想的狀況下,必須在集羣較控線的時段運行均衡器,這樣開銷一般不高。能夠調整均衡器的帶寬,以肯定集羣中每一個DataNode可用於從新均衡的每秒字節數。
在增長帶寬以前,請確保有足夠的帶寬。能夠經過"ethtool"等工具查看NIC卡的速度,以下所示。
[root@hadoop101.yinzhengjie.com ~]# ethtool bond0 #個人筆記本網卡的速度是1000Mb/s,所以能夠將均衡器代碼設置爲它的10%,即100MB。服務器的網卡速度會更快(基本上都是萬兆口),推薦設置1G以上。 Settings for bond0: Supported ports: [ ] Supported link modes: Not reported Supported pause frame use: No Supports auto-negotiation: No Supported FEC modes: Not reported Advertised link modes: Not reported Advertised pause frame use: No Advertised auto-negotiation: No Advertised FEC modes: Not reported Speed: 1000Mb/s Duplex: Full Port: Other PHYAD: 0 Transceiver: internal Auto-negotiation: off Link detected: yes [root@hadoop101.yinzhengjie.com ~]#
帶寬的默認值爲10MB/s,能夠提升該值以使均衡器更快地完成工做。能夠將帶寬提升到網絡速度的大約10%,這不會對集羣的工做負載形成任何明顯的影響。 能夠修改"hdfs-site.xml"中的"dfs.datanode.balance.bandwidthPerSec"屬性(默認10MB),也可使用hdfs dfsadmin命令設置均衡器使用的網絡帶寬,以下所示。
舒適提示:
若是均衡器要運行很長時間,則能夠安排它在峯值和非峯值時段以不一樣的帶寬運行。能夠在峯值時段以低帶寬運行,而且在集羣不太忙的時段以較高的帶寬運行。一次只能運行一個均衡器做業,當非高峯做業啓動時,它中止高峯均衡器做業。
[root@hadoop101.yinzhengjie.com ~]# hdfs dfsadmin -help setBalancerBandwidth -setBalancerBandwidth <bandwidth>: Changes the network bandwidth used by each datanode during HDFS block balancing. <bandwidth> is the maximum number of bytes per second that will be used by each datanode. This value overrides the dfs.balance.bandwidthPerSec parameter. --- NOTE: The new value is not persistent on the DataNode.--- [root@hadoop101.yinzhengjie.com ~]#
[root@hadoop101.yinzhengjie.com ~]# hdfs dfsadmin -setBalancerBandwidth 104857600 #設置100MB帶寬,該值將覆蓋"dfs.datanode.balance.bandwidthPerSec"屬性(不推薦使用"dfs.balance.bandwidthPerSec"參數,該參數在Hadoop 3.x版本已廢棄) Balancer bandwidth is set to 104857600 [root@hadoop101.yinzhengjie.com ~]#
5>.使用均衡器注意事項
(1)默認的DataNode策略是在DataNode級別均衡存儲,但均衡器不會在DataNode的各個存儲卷之間均衡數據。 (2)僅當DataNode使用的DFS百分比和(由集羣使用的)平均DFS之間的差大於(或小於)規定閾值時,均衡器纔會均衡DataNode。不然,它不會從新均衡集羣。 (3)均衡器運行多長時間取決於集羣的大小和數據的不平衡程度。第一次運行均衡器,或者不常常調度均衡器,以及在添加一組DataNode以後運行均衡器,它將運行很長時間(一般是幾天,若是數據量達到PB或者接近EB級別,可能須要一個多月的時間來均衡喲~) (4)若是有一個數據寫入和刪除頻繁的集羣,集羣可能永遠不會達到徹底均衡的狀態,均衡器僅僅將數據從一個節點移動到另外一個節點。 (5)向集羣添加新節點後最好當即運行均衡器。若是一次添加大量節點,則運行均衡器須要一段時間才能完成其工做。 (6)若是肯定閾值?這很容易,秩序選擇整個集羣中節點最低DFS使用百分比便可。沒必要花費大量的時間瞭解每一個節點使用的DFS百分比,使用"hdfs dfsadmin -report"命令便可找出正確的閾值。閾值越小,均衡器須要執行的工做越多,集羣就越均衡。