MapReduce任务异常,临时文件未删除
问题现象
HDFS临时目录文件过多,占用内存。
原因分析
MapReduce任务提交时会将相关配置文件、jar包和-files参数后添加的文件都上传至HDFS的临时目录,方便Container启动后获取相应的文件。系统通过配置项“yarn.app.mapreduce.am.staging-dir”决定具体存放位置,默认值是“/tmp/hadoop-yarn/staging”。
正常运行的MapReduce任务会在Job结束以后就清理这些临时文件,但是当Job对应的Yarn任务异常退出时,这些临时文件不会被清理,长时间积攒导致该临时目录下的文件数量越来越多,占用存储空间越来越多。
处理步骤
- 登录集群客户端。
- 获取文件列表。
hdfs dfs -ls /tmp/hadoop-yarn/staging/*/.staging/ | grep "^drwx" | awk '{print $8}' > job_file_list
job_file_list文件中就是所有任务的文件夹列表,文件内容参考:
/tmp/hadoop-yarn/staging/omm/.staging/job__<Timestamp>_<ID>
- 统计当前运行中的任务。
mapred job -list 2>/dev/null | grep job_ | awk '{print $1}' > run_job_list
run_job_list文件里面就是当前正在运行的JobId列表,文件内容格式为:
job_<Timestamp>_<ID>
- 删除job_file_list文件中正在运行中的任务,确保在删除过期数据时不会误删正在运行任务的数据。
cat run_job_list | while read line; do sed -i "/$line/d" job_file_list; done
- 删除过期数据。
cat job_file_list | while read line; do hdfs dfs -rm -r $line; done
- 清除临时文件。
rm -rf run_job_list job_file_list