我使用YARN java API提交Hadoop应用程序而不是终端。 我想方法在应用程序完成后通过Yarn API获取纱线聚合日志。
当然可以通过简单的cmd完成:“yarn logs -applicationId {my_application_ID}”但我希望通过API实现。
有人知道如何使用API而不是命令行来获取这些日志吗?
感谢。
答案 0 :(得分:2)
尽可能在代码源https://github.com/apache/hadoop/blob/trunk/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-client/src/main/java/org/apache/hadoop/yarn/client/cli/LogsCLI.java上,这并非易事,显然,YARN API缺少日志API 。
curl http://yarn.infra/ws/v1/cluster/apps/application_1502112083252_1001
...
<amContainerLogs>
http://node-1.infra:8042/node/containerlogs/container_e41_1502112083252_1001_01_000001/hdfs
</amContainerLogs>
...
应用程序尝试(如果对您有用):
curl http://yarn.infra/ws/v1/cluster/apps/application_1502112083252_1001/appattempts
..
<logsLink>
http://node-3.infra:8042/node/containerlogs/container_e41_1502112083252_1001_01_000001/hdfs
</logsLink>
..
让我们重新卷曲这些链接,这将让您下载本地日志。但这不是完整的日志,(我没有找到如何获得它,如果你找到它,请随时完成我的答案。)
答案 1 :(得分:1)
据我所知,YARN将日志写入文件系统,可能是HDFS(在我的情况下:hdfs:hadoopsrv:9000/var/log/hadoop/app-logs/
),具有这些文件访问权限的用户可以直接获取它们。根据我的理解,yarn logs -applicationId
只是从那里获得它们。
答案 2 :(得分:0)
一种收集日志的方法是简单地在Java代码中调用 LogsCLI.main()。 该调用将应用程序日志输出到标准输出。
import org.apache.hadoop.yarn.client.cli.LogsCLI;
private void collectLogs()
{
String[] args = {"-applicationId", appId.toString()};
try {
LogsCLI.main(args);
} catch (Exception e) {
LOG.warn("Error when collecting Yarn Application logs");
LOG.debug(e);
}
}