Datanode磁盘IO高 hdfs du -sk 导致机器load高

2023-12-06 20:20

本文主要是介绍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>

临时解决方案 

  1. 使用 df 命令替换 du
  2. 允许用户自定义检查间隔时间

解决方案(优化):

社区优化方案:
使用 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高的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/463185

相关文章

MySQL版本问题导致项目无法启动问题的解决方案

《MySQL版本问题导致项目无法启动问题的解决方案》本文记录了一次因MySQL版本不一致导致项目启动失败的经历,详细解析了连接错误的原因,并提供了两种解决方案:调整连接字符串禁用SSL或统一MySQL... 目录本地项目启动报错报错原因:解决方案第一个:第二种:容器启动mysql的坑两种修改时区的方法:本地

如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socket read timed out的问题

《如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socketreadtimedout的问题》:本文主要介绍解决Druid线程... 目录异常信息触发场景找到版本发布更新的说明从版本更新信息可以看到该默认逻辑已经去除总结异常信息触发场景复

Linux给磁盘扩容(LVM方式)的方法实现

《Linux给磁盘扩容(LVM方式)的方法实现》本文主要介绍了Linux给磁盘扩容(LVM方式)的方法实现,涵盖PV/VG/LV概念及操作步骤,具有一定的参考价值,感兴趣的可以了解一下... 目录1 概念2 实战2.1 相关基础命令2.2 开始给LVM扩容2.3 总结最近测试性能,在本地打数据时,发现磁盘空

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

Python文件操作与IO流的使用方式

《Python文件操作与IO流的使用方式》:本文主要介绍Python文件操作与IO流的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、python文件操作基础1. 打开文件2. 关闭文件二、文件读写操作1.www.chinasem.cn 读取文件2. 写

SQL中redo log 刷⼊磁盘的常见方法

《SQL中redolog刷⼊磁盘的常见方法》本文主要介绍了SQL中redolog刷⼊磁盘的常见方法,将redolog刷入磁盘的方法确保了数据的持久性和一致性,下面就来具体介绍一下,感兴趣的可以了解... 目录Redo Log 刷入磁盘的方法Redo Log 刷入磁盘的过程代码示例(伪代码)在数据库系统中,r

解决SpringBoot启动报错:Failed to load property source from location 'classpath:/application.yml'

《解决SpringBoot启动报错:Failedtoloadpropertysourcefromlocationclasspath:/application.yml问题》这篇文章主要介绍... 目录在启动SpringBoot项目时报如下错误原因可能是1.yml中语法错误2.yml文件格式是GBK总结在启动S

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

C#多线程编程中导致死锁的常见陷阱和避免方法

《C#多线程编程中导致死锁的常见陷阱和避免方法》在C#多线程编程中,死锁(Deadlock)是一种常见的、令人头疼的错误,死锁通常发生在多个线程试图获取多个资源的锁时,导致相互等待对方释放资源,最终形... 目录引言1. 什么是死锁?死锁的典型条件:2. 导致死锁的常见原因2.1 锁的顺序问题错误示例:不同

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存