内容纲要
概要描述
TDH的日常巡检中,我们经常会遇到hdfs fsck的巡检结果, missing replicas 中 /yarn1/user/Username/.staging/非常的多。比如:

本文主要介绍该目录的生成原理和解决办法。
详细说明
现象说明
yarn在执行任务作业的时候,需要将执行作业所需要的资源,包括作业的jar包,配置文件,计算好的输入切片拷贝到共享文件系统的以作业ID命名的目录中(e.g. /yarn1/user/hdfs/.staging/job_1656378031471_0069/ )。让不同的datanode机器拉取这些jar包运行的时候,可以更快。
该参数默认值是10,一般我们建议设置为集群datanode机器个数的开方(比如25台datanode,这个参数就改成5)。
如果你的datanode的个数小于10,那你在跑任务期间执行hdfs fsck / 就会有丢失副本(Missing replicas),同样的,如果yarn任务执行失败,这部分文件残留的话,也一样会存在此类问题。
解决方案
1. 修改mapreduce.client.submit.file.replication参数
此参数默认值为10,建议调整为集群datanode机器个数的开方(比如25台datanode,这个参数就改成5)
2. 对这部分/yarn1/user/开头的文件批量修改文件副本数
比如这里集群的dfs.replication 默认为3
## 修复Under-replicated blocks:
## 查询到Under-replicated blocks的路径
hdfs fsck / | grep 'Under replicated' |egrep '^/yarn1/user/' | awk -F':' '{print $1}' >> /tmp/under_replicated_files
##再根据路径进行修复
for hdfsfile in cat /tmp/under_replicated_files; do echo "Fixing $hdfsfile :" ; hadoop fs -setrep 3
历史残留的文件可以通过方案二setrep来解决,但是该方案治标不治本,建议参考方案一防止后面再遇到类似的问题。