内容纲要
问题描述
单个节点内DataNode的各磁盘使用率不均匀,有些磁盘快满了有些几乎没用
例如:
189-39-235-71:~ # df -h
Filesystem Size Used Avail Use% Mounted on
/dev/xvda 360G 92G 250G 28% /
/dev/xvdb 700G 900G 200G 78% /srv/BigData/hadoop/data1
/dev/xvdc 700G 900G 200G 78% /srv/BigData/hadoop/data2
/dev/xvdd 700G 900G 200G 78% /srv/BigData/hadoop/data3
/dev/xvde 700G 900G 200G 78% /srv/BigData/hadoop/data4
/dev/xvdf 10G 900G 890G 2% /srv/BigData/hadoop/data5
189-39-235-71:~ #
可能原因
1, 部分磁盘故障,更换为新盘,因此新盘使用率低。
2, 增加了磁盘个数,如原先4个数据盘,现扩容为5个盘。
注意:对于TDH 9.0 产品,hadoop 已经升级到3.X 可以利用hdfs diskbalancer 来进行磁盘间数据均衡
原因分析
DataNode节点内写block磁盘时,有2种策略“轮询”和“优先写剩余磁盘空间多的磁盘”,默认是“轮询”。
参数说明:dfs.datanode.fsdataset.volume.choosing.policy
可选值:
轮询:org.apache.hadoop.hdfs.server.datanode.fsdataset.RoundRobinVolumeChoosingPolicy
优先写剩余空间多的磁盘: org.apache.hadoop.hdfs.server.datanode.fsdataset.AvailableSpaceVolumeChoosingPolicy
解决方法
将DataNode选择磁盘策略的参数 dfs.datanode.fsdataset.volume.choosing.policy 的值改为
org.apache.hadoop.hdfs.server.datanode.fsdataset.AvailableSpaceVolumeChoosingPolicy
让DataNode根据磁盘剩余空间大小,优先选择磁盘剩余空间多的节点存储数据副本
在TDH集群中,可以通过添加3个参数设置调整为优先往空闲磁盘写数据,配置方法如下(注意格式):
a) 在hdfs页面添加下面3个自定义参数
b) 配置服务,并重启hdfs服务
注:关于上述3个参数的解释:
dfs.datanode.fsdataset.volume.choosing.policy
--该参数配置成AvailableSpaceVolumeChoosingPolicy,DataNode在选择磁盘存储数据时,会选择可用磁盘空间最大的磁盘来存储数据,这样保证了小盘不会存储过多的数
dfs.datanode.available-space-volume-choosing-policy.balanced-space-threshold
--该参数配置是首先计算出两个值,一个是所有磁盘中最大可用空间,另外一个值是所有磁盘中最小可用空间,如果这两个值相差小于该配置项指定的阀值时,则就用轮询方式的磁盘选择策略选择磁盘存储数据副本
dfs.datanode.available-space-volume-choosing-policy.balanced-space-preference-fraction
--该参数配置是指有多少比例的数据副本应该存储到剩余空间足够多的磁盘上。该配置项取值范围是0.0-1.0,一般取0.5-1.0,如果配置太小,会导致剩余空间足够的磁盘实际上没分配足够的数据副本,而剩余空间不足的磁盘取需要存储更多的数据副本,导致磁盘数据存储不均衡
--配置成1.0f的话会优先按照磁盘剩余空间大小,选择空余最多的磁盘,将数据全部写到该盘上面