本文主要是介绍Datanode磁盘IO高 hdfs du -sk 导致机器load高,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
hdfs 会定期(默认10分钟)使用 du -sk 命令统计BP的大小,
在大硬盘机器上该操作耗时将会很长(可能超过10分钟),尤其是共享盘或者磁盘IO不高情况下,
这会导致 iowait 以及 load的提升,从而导致IO高,数据读写并不高的现象。
问题现象:
社区问题单:
[HDFS-14313] Get hdfs used space from FsDatasetImpl#volumeMap#ReplicaInfo in memory instead of df/du - ASF JIRA
iotop排查有大量的du -sk 操作占用IO比较高,且执行很长时间;
iostat -x 5: 磁盘IOutil 一直处于比较高的使用率,且iowait值比较大,io有一定的等待延迟;
问题原因:
Datanode进程启动时,启动DU线程定期执行du –sk命令统计各blockpool目录的占用情况,随着心跳汇报给namenode。
执行周期默认为600000ms, 配置项为fs.du.interval;
临时优化方案:
增加fs.du.interval 磁盘检测时间间隔,调整至适当大的值30min,尽量减缓这种io占用高的情况
<property>
<name>fs.du.interval</name>
<value>1800000</value>
</property>
————————————————
所以,对于DN来说,默认的Du,会产生大量的du -sk的操作,会造成集群严重的IO Wait增加,从而导致任务会变得缓慢。
————————————————
相关代码:
社区为了解决这个问题,主要在两个方面进行了改造:
https://issues.apache.org/jira/browse/HADOOP-9884
<property>
<name>fs.getspaceused.classname</name>
<value></value>
<description>
The class that can tell estimate much space is used in a directory.
There are four impl classes that being supported:
org.apache.hadoop.fs.DU(default), org.apache.hadoop.fs.WindowsGetSpaceUsed
org.apache.hadoop.fs.DFCachingGetSpaceUsed and
org.apache.hadoop.hdfs.server.datanode.fsdataset.impl.ReplicaCachingGetSpaceUsed.
And the ReplicaCachingGetSpaceUsed impl class only used in HDFS module.
</description>
</property><property>
<name>fs.getspaceused.jitterMillis</name>
<value>60000</value>
<description>
fs space usage statistics refresh jitter in msec.
</description>
</property>
</configuration>
临时解决方案
- 使用 df 命令替换 du
- 允许用户自定义检查间隔时间
解决方案(优化):
社区优化方案:
使用 df 命令替换 du(可配置,使用df前提条件磁盘目录下存储只有hdfs单块池占用);
增加检查间隔时间随机抖动机制;(将一个节点上同时产生的多个du操作,加个随机数,随机到集群的不同时间段,)
Fix version: 2.8.0, 3.0.0-alpha1
相关patch:
https://issues.apache.org/jira/browse/HADOOP-9884
https://issues.apache.org/jira/browse/HADOOP-12973
https://issues.apache.org/jira/browse/HADOOP-12974
https://issues.apache.org/jira/browse/HADOOP-12975
相关代码截图:
问题虽然被解决了,不过低于hadoop2.8的版本需要升级或者打patch的方式进行优化,较为麻烦。
不过也有一些临时的方案,比如说捕获到hdfs调用的 du -sk 命令,使用 df -k 进行替换。
tip: 这个方法的前提是每个BP目录单独位于一个磁盘上。
du 脚本,对正常的du命令不进行修改
mv /usr/bin/du /usr/bin/du_bak
vim /usr/bin/du#!/bin/sh
if [[ $2 == */current/BP-* ]] && [ $1 == -sk ]
thenused=`df -k $2 | grep -vE 'Used|可用' | awk '{print $3}'`echo -e "$used\t$2"
elseecho -e "$(du_bak $@)"
fichmod +x /usr/bin/du
红框为某机器替换后的du命令的效果,1图黄色部分为iowait比例:
cpu util
load
这篇关于Datanode磁盘IO高 hdfs du -sk 导致机器load高的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!