天天看點

HDFS Balancer負載均衡器

作者:huan1993

1、背景

當我們的hadoop叢集運作了一段時間之後,各個DataNode上的資料分布并不一定是均勻分布的。比如說: 我們向現有叢集中添加了一個新的DataNode。

HDFS Balancer負載均衡器

DataNode資料不均衡

2、什麼是平衡

此處是我自己的一個簡單的了解

所謂的平衡指的是 每個DataNode的使用率 與 叢集的使用率 之間相差不超過給定的門檻值百分比。此處的平衡 指的是各個DataNode之間的平衡,同一個DataNode之間的各個磁盤是不會平衡的。

2.1 每個DataNode的使用率計算

HDFS Balancer負載均衡器

每個DataNode的使用率計算

DataNode的使用率= dfs已用的空間 / 配置設定給dfs的空間。

注意: 配置設定給dfs的空間 不是磁盤的總空間。

2.2 叢集的使用率

HDFS Balancer負載均衡器

叢集的使用率

叢集的使用率= 各datanode dfs已使用的空間 / 各datanode總空間

2.3 平衡

假設平衡的門檻值是 5%,叢集的使用率是 37.5,那麼每個節點的使用率在32.5%到42.5%之間都認為是均衡的。也就是說,極端情況下,DataNode的使用率最大相差10%。

3、hdfs balancer文法

[hadoopdeploy@hadoop01 ~]$ 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.
 [-asService] Run as a long running service.

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]
           
參數 描述
threshold 磁盤容量的百分比。預設值為10%,表示上下浮動10%。
policy

平衡政策。

datanode(預設):當每一個DataNode是平衡的時候,叢集就是平衡的。

blockpool:當每一個DataNode中的blockpool是平衡的,叢集就是平衡的。

exclude 不參與平衡的DataNode節點
include 參與平衡的DataNode節點
source 僅選取指定的資料節點作為源節點
blockpools Balancer僅在指定的blockpools中運作
idleiterations 退出前的連續空閑疊代次數(-1表示無限)
-runDuringUpgrade 是否在正在進行的HDFS更新過程中運作平衡器。通常不需要這樣做,因為這不會影響過度使用的計算機上的已用空間。
-asService 作為長期運作的服務運作

4、運作一個簡單的balance案例

4.1 設定平衡資料傳輸帶寬

[hadoopdeploy@hadoop01 ~]$ hdfs dfsadmin  -setBalancerBandwidth 10485760
Balancer bandwidth is set to 10485760
[hadoopdeploy@hadoop01 ~]$
           

當我們的叢集負載需要調低這個值,當我們的叢集負載較低時,可以适當調高這個值。

4.2 執行banalce

[hadoopdeploy@hadoop01 ~]$ hdfs balancer -policy datanode -threshold 5
2023-03-26 14:10:09,785 INFO balancer.Balancer: Using a threshold of 5.0
2023-03-26 14:10:09,786 INFO balancer.Balancer: namenodes  = [hdfs://hadoop01:8020]
2023-03-26 14:10:09,786 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]
2023-03-26 14:10:09,786 INFO balancer.Balancer: included nodes = []
2023-03-26 14:10:09,786 INFO balancer.Balancer: excluded nodes = []
2023-03-26 14:10:09,786 INFO balancer.Balancer: source nodes = []
Time Stamp               Iteration#  Bytes Already Moved  Bytes Left To Move  Bytes Being Moved  NameNode
2023-03-26 14:10:09,787 INFO balancer.NameNodeConnector: getBlocks calls for hdfs://hadoop01:8020 will be rate-limited to 20 per second
2023-03-26 14:10:10,392 INFO balancer.Balancer: dfs.namenode.get-blocks.max-qps = 20 (default=20)
2023-03-26 14:10:10,392 INFO balancer.Balancer: dfs.balancer.movedWinWidth = 5400000 (default=5400000)
2023-03-26 14:10:10,392 INFO balancer.Balancer: dfs.balancer.moverThreads = 1000 (default=1000)
2023-03-26 14:10:10,392 INFO balancer.Balancer: dfs.balancer.dispatcherThreads = 200 (default=200)
2023-03-26 14:10:10,392 INFO balancer.Balancer: dfs.balancer.getBlocks.size = 2147483648 (default=2147483648)
2023-03-26 14:10:10,392 INFO balancer.Balancer: dfs.balancer.getBlocks.min-block-size = 10485760 (default=10485760)
2023-03-26 14:10:10,392 INFO balancer.Balancer: dfs.datanode.balance.max.concurrent.moves = 100 (default=100)
2023-03-26 14:10:10,392 INFO balancer.Balancer: dfs.datanode.balance.bandwidthPerSec = 104857600 (default=104857600)
2023-03-26 14:10:10,395 INFO balancer.Balancer: dfs.balancer.max-size-to-move = 10737418240 (default=10737418240)
2023-03-26 14:10:10,395 INFO balancer.Balancer: dfs.blocksize = 134217728 (default=134217728)
2023-03-26 14:10:10,401 INFO net.NetworkTopology: Adding a new node: /default-rack/192.168.121.141:9866
2023-03-26 14:10:10,401 INFO net.NetworkTopology: Adding a new node: /default-rack/192.168.121.140:9866
2023-03-26 14:10:10,401 INFO net.NetworkTopology: Adding a new node: /default-rack/192.168.121.142:9866
2023-03-26 14:10:10,402 INFO balancer.Balancer: 0 over-utilized: []
2023-03-26 14:10:10,402 INFO balancer.Balancer: 0 underutilized: []
2023-3-26 14:10:10                0                  0 B                 0 B                0 B                  0  hdfs://hadoop01:8020
The cluster is balanced. Exiting...
2023-3-26 14:10:10       Balancing took 810.0 milliseconds
[hadoopdeploy@hadoop01 ~]$
           

5、參考文檔

1、https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HdfsUserGuide.html#Balancer

2、https://help.aliyun.com/document_detail/449686.html

繼續閱讀