替换 HDFS 镜像里的 du 操作步骤

  性能相关, 内部使用
内容纲要

概要说明

问题背景:在hadoop开源版本中,du默认配置10分钟,df默认配置1分钟。du -sk命令会导致机器load高。开源修复:为du命令增加抖动,修复版本2.7.4,2.8.0。具体可参考:
https://issues.apache.org/jira/browse/HADOOP-12975
https://www.jianshu.com/p/8a819763b320

详细说明


解决方案:
(1)修改du默认配置fs.du.interval ,增加执行间隔。但明显的,该操作只能降低异常频率,并不能解决du执行时load高的问题。根据大数据集群分布式的考量,普通节点低频率的load高可接受,但是哪怕一次出现在管理节点(TDH目前的架构,主要是inceptor server节点等)一次,都是很严重的。

(2)捕获到hdfs调用的 du -sk 命令,使用 df -k 进行替换。a.该操作的前提条件是每个BP目录单独位于一个磁盘上,TDH目前满足该条件。b.该操作的不会对正常du命令产生影响。c.hdfs调用du -sk和调用df -k执行结果对功能无影响
根据以上要求,具体的解决方案如下。

1、5.0以上集群

  1. 创建 dockerbuild 目录
    mkdir -m 755 -pv /tmp/dockerbuild && cd /tmp/dockerbuild

  2. 编写 du 脚本
    vi /tmp/dockerbuild/du
    由于 kb 的 markdown 无法显示反引号,正确的格式是这样的;
    use=反引号df -k $2 | grep -vE ‘Used|可用’ | awk ‘{print $3}’反引号,

    #!/bin/bash
    if [[ $2 == */BP-* ]] && [ $1 == -sk ]
    then
    used=df -k $2 | grep -vE 'Used|可用' | awk '{print $3}'
    echo -e "$used\t$2"
    else
    echo -e "$(du_bak $@)"
    fi
  3. 找出 hdfs-datanode 所用的 image
    kubectl describe po $(kubectl get po -o wide | grep -i hdfs.*datanode | awk ‘{print $1}’ | head -1) | grep -iE "image:"

    如果以上 kubectl 命令找出的不是带有 5000 端口的 image 镜像,请用以下命令找出和集群版本一致的带5000端口的镜像:
    docker images -a | grep -i hdfs

  4. 编写 DockerFile
    vi DockerFile

DockerFile 内容:
amen01-7:5000/transwarp/hdfs:transwarp-5.2.2-final 为刚才第 3 步找到的 image 镜像

FROM amen01-7:5000/transwarp/hdfs:transwarp-5.2.2-final
RUN mv /usr/bin/du /usr/bin/du_bak
ADD du /usr/bin/du
RUN chmod +x /usr/bin/du
  1. 重新 build 镜像,注意 -t 后面的镜像替换为实际的镜像名
    docker build -f DockerFile -t amen01-7:5000/transwarp/hdfs:transwarp-5.2.2-final ./

  2. 重新 push 镜像到仓库,镜像换为实际的名称
    docker push amen01-7:5000/transwarp/hdfs:transwarp-5.2.2-final

  3. 到 manager 8180 界面滚动重启 datanode

2、4.X 集群

新建一个/tmp/du的文件,内容是:

#!/bin/bash
if [[ $2 == */BP-* ]] && [ $1 == -sk ]
then
    used=df -k $2 | grep -vE 'Used|可用' | awk '{print $3}'
    echo -e "$used\t$2"
else
    echo -e "$(du_bak $@)"
fi

之后用这个文件替代du命令:

mv /usr/bin/du /usr/bin/du_bak
mv /tmp/du /usr/bin/du
chmod +x /usr/bin/du

注意一定要重命名为du_bak

因为4.X没有容器化,所以所有的hdfs节点都要做上面的步骤。
完成之后重启hdfs。

这篇文章对您有帮助吗?

平均评分 0 / 5. 次数: 0

尚无评价,您可以第一个评哦!

非常抱歉,这篇文章对您没有帮助.

烦请您告诉我们您的建议与意见,以便我们改进,谢谢您。