最近遇到运行yarn pi的时候遇到如下问题。
很明显是container出错了,但是错误没有提示的很清楚。然后去看nodemanager日志也是如此。这时候笔者第一个想到要去看container的执行日志。container具体的日志目录位置是通过YARN的配置文件(如yarn-site.xml
)中的yarn.nodemanager.log-dirs
属性定义的,默认为$HADOOP_HOME/logs/userlogs。去对应的nodemanager的userlogs下发现没有任何日志,查看nodemanager日志发现如果任务失败了,默认会删除container日志。
笔者觉得可以改一下源码,让他先不删日志。
DefaultContainerExecutor.java
@Override
public void deleteAsUser(DeletionAsUserContext ctx)
throws IOException, InterruptedException {
Path subDir = ctx.getSubDir();
List<Path> baseDirs = ctx.getBasedirs();
if (baseDirs == null || baseDirs.size() == 0) {
LOG.info("Deleting absolute path : " + subDir);
//if (!lfs.delete(subDir, true)) {
//Maybe retry
LOG.warn("delete returned false for path: [" + subDir + "]");
//}
return;
}
for (Path baseDir : baseDirs) {
Path del = subDir == null ? baseDir : new Path(baseDir, subDir);
LOG.info("Deleting path : " + del);
//try {
//if (!lfs.delete(del, true)) {
//LOG.warn("delete returned false for path: [" + del + "]");
//}
//} catch (FileNotFoundException e) {
//continue;
//}
}
}
调整完了,重新打包一下当前项目,替换一下share/hadoop/yarn/hadoop-yarn-server-nodemanager-3.1.1.jar,重新执行就可以看到container执行日志了。
发现是job.xml加载有问题。后续经过分析解决了问题。当然container也可能报了其他问题,根据日志可以自行分析解决。
喜欢就点赞、收藏一下~