Hadoop Yarn暂存目录缺失求助:伪分布式下JobHistory日志查找失败
解决Hadoop 3.0.0伪分布式下日志聚合后找不到JobHistory目录的问题
刚搭完Hadoop 3.0.0伪分布式就碰上个日志找不到的问题?我之前也踩过类似的坑,咱们一步步排查:
先确认日志聚合的核心配置有没有配对
Hadoop 3.x的日志聚合路径和旧版本不太一样,你之前找的/user/uname/.staging/job_id/是老版本的路径,先去检查yarn-site.xml里的关键配置:
- 确保
yarn.log-aggregation-enable设为true,这是开启日志聚合的核心开关 yarn.nodemanager.remote-app-log-dir:这才是聚合日志存储的根路径,默认是/tmp/logs,不是用户目录下的.stagingyarn.nodemanager.remote-app-log-dir-suffix:默认是logs,所以最终的日志路径应该是/tmp/logs/<你的用户名>/logs/<job-id>
改完配置记得重启YARN的所有服务:ResourceManager、NodeManager,还有JobHistoryServer——别漏了后者,它负责处理作业历史数据。
检查JobHistoryServer的配置和状态
Hadoop 3里JobHistoryServer是独立服务,得手动启动:
mr-jobhistory-daemon.sh start historyserver
同时去mapred-site.xml确认几个关键参数:
mapreduce.jobhistory.address:默认localhost:10020,是服务的监听地址mapreduce.jobhistory.webapp.address:默认localhost:19888,这个WebUI能直接查看作业历史,点进对应作业就能看到日志的实际存储路径mapreduce.jobhistory.done-dir:完成的作业元数据存储目录,默认/tmp/hadoop-yarn/staging/history/done,Hadoop会自动创建,但要确保权限没问题
用命令快速定位正确的日志路径
别死磕旧路径了,直接用HDFS命令搜索:
- 先查看当前用户的日志目录:
hdfs dfs -ls /tmp/logs/$(whoami)/logs/
- 要是知道具体job-id,直接全局搜索:
hdfs dfs -find / -name "*<你的job-id>*"
另外,打开http://localhost:19888,找到你提交的作业,点击进去看日志链接,里面会显示完整的HDFS路径,比瞎找高效多了。
权限问题很容易被忽略
如果还是找不到,先检查权限配置:
- 确保日志根目录(比如
/tmp/logs)的权限是可读写的,用这个命令修改:
hdfs dfs -chmod 777 /tmp/logs
- 别用root用户运行Hadoop!很多权限冲突都是因为用了root,建议用普通用户(比如hadoop用户)启动所有服务,避免权限问题。
提交测试作业验证日志聚合
光看配置没用,提交个简单的作业试试,比如自带的wordcount示例:
hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-examples-3.0.0.jar wordcount /input /output
作业跑完后,再去HDFS里看日志目录有没有生成,同时去JobHistoryWebUI里查看是否能看到日志。如果还是不行,去NodeManager的日志目录($HADOOP_HOME/logs/下找yarn-<用户>-nodemanager-<主机名>.log),搜索log aggregation关键词,看看有没有上传失败的报错信息。
内容的提问来源于stack exchange,提问作者PHcoDer
相关产品推荐
相关产品推荐

