概要说明
问题背景:在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以上集群
-
创建 dockerbuild 目录
mkdir -m 755 -pv /tmp/dockerbuild && cd /tmp/dockerbuild -
编写 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 -
找出 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 -
编写 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
-
重新 build 镜像,注意 -t 后面的镜像替换为实际的镜像名
docker build -f DockerFile -t amen01-7:5000/transwarp/hdfs:transwarp-5.2.2-final ./ -
重新 push 镜像到仓库,镜像换为实际的名称
docker push amen01-7:5000/transwarp/hdfs:transwarp-5.2.2-final -
到 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。