Hadoop的HDFS集群非常容易出现机器与机器之间磁盘利用率不平衡的情况,比如集群中添加新的数据节点。当HDFS出现不平衡状况的时候,将引发很多问题,比如MR程序无法很好地利用本地计算的优势,机器之间无法达到更好的网络带宽使用率,机器磁盘无法利用等等。
随着HDFS集群规模的不断增大,默认的配置参数,不能满足快速balancer的要求,需要对参数进行调优。
一、修改hdfs-site.xml配置文件
1.修改dfs.datanode.max.transfer.threads = 8192 (默认值4096),指定用于在DataNode间传输block数据的最大线程数;
2.修改dfs.datanode.balance.max.concurrent.moves = 50(默认值5),指定DataNode上同时用于balance待移动block的最大线程个数.
二、调整Balancer带宽限制
根据机器带宽调整Balancer带宽限制,执行以下命令,限制单机带宽为200MB:
hdfs dfsadmin -setBalancerBandwidth 209715200
三、执行balancer
hdfs balancer -threshold 20 &>> /tmp/balancer_`date +%F`.log &
-threshold 默认设置:10,参数取值范围:0-100,参数含义:判断集群是否平衡的目标参数,每一个datanode存储使用率和集群总存储使用率的差值都应该小于这个阀值 ,理论上,该参数设置的越小,整个集群就越平衡,但是在线上环境中,hadoop集群在进行balance时,还在并发的进行数据的写入和删除,所以有可能无法到达设定的平衡参数值。
四、验证
查看日志:/tmp/balancer_`date +%F`.log
过滤出以下信息,能看出balancer的速度
Aug 14, 2019 4:29:18 PM 1 7.74 GB 100.57 GB 10 GB
Aug 14, 2019 4:36:37 PM 2 11.91 GB 95.10 GB 10 GB
Aug 14, 2019 4:41:16 PM 3 14.55 GB 90.28 GB 10 GB
Aug 14, 2019 4:51:25 PM 4 20.59 GB 87.62 GB 10 GB
Aug 14, 2019 4:52:13 PM 5 30.70 GB 82.40 GB 10 GB
Aug 14, 2019 4:52:56 PM 6 40.81 GB 72.21 GB 10 GB
Aug 14, 2019 4:53:46 PM 7 50.82 GB 62.02 GB 10 GB
Aug 14, 2019 4:54:35 PM 8 60.85 GB 51.94 GB 10 GB
Aug 14, 2019 4:55:25 PM 9 70.92 GB 41.83 GB 10 GB
Aug 14, 2019 4:56:06 PM 10 80.95 GB 31.12 GB 10 GB
Aug 14, 2019 4:56:45 PM 11 88.53 GB 21.02 GB 10 GB
Aug 14, 2019 4:57:28 PM 12 98.58 GB 13.37 GB 10 GB
Aug 14, 2019 4:58:05 PM 13 108.60 GB 3.24 GB 10 GB
Aug 14, 2019 4:58:14 PM 14 108.60 GB 0 B -1 B
Aug 14, 2019 4:58:15 PM Balancing took 42.461133333333336 minutes
以上方法并不能提高性能,还需要代码级的优化:参考Hdfs-
13813
\Hdfs
-
9412
\HDFS
-
8824
以及hadoop3.
1
代码优化hdfs balancer:将getDatanodeStorageReport和getblocks的请求发送到Namenode standby以及忽略小数据块。
Hdfs-site.xml中添加
dfs.namenode.balancer.request.standby
true
dfs.balancer.getBlocks.min-block-size
10485760