为什么即使启用了日志记录,我的 yarn 应用程序也没有日志?

Why does my yarn application not have logs even with logging enabled?

我在 xml 文件中启用了日志:yarn-site.xml,并且我通过执行以下操作重新启动了 yarn

sudo service hadoop-yarn-resourcemanager restart
sudo service hadoop-yarn-nodemanager restart

我 运行 我的应用程序,然后我在 yarn application -list 中看到了 applicationID。所以,我这样做:yarn logs -applicationId <application ID>,我得到以下结果:

hdfs://<ip address>/var/log/hadoop-yarn/path/to/application/  does not have any log files

我需要更改一些其他配置吗?还是我以错误的方式访问日志?

谢谢。

启用日志聚合

yarn-site.xml 文件中启用了日志聚合。 yarn.log-aggregation-enable 属性 为 运行 应用程序启用日志聚合。

<property>
 <name>yarn.log-aggregation-enable</name>
 <value>true</value>
</property>

它可能是用另一个 appOwner 保存的。您可以尝试在命令中指定应用程序所有者:

纱线日志-appOwner .. -application_id ..

yarn application -list

将仅列出处于 SUBMITTEDACCEPTED[=39 中的申请=]运行状态。

日志聚合收集每个容器的日志,并且仅在应用程序完成后将这些日志移动到yarn.nodemanager.remote-app-log-dir中配置的目录中。参考yarn.log-aggregation-enable 属性 here.

的描述

因此,命令列出的 applicationId 尚未完成,尚未收集日志。因此,尝试访问 运行 应用程序

的日志时的响应
hdfs://<ip address>/var/log/hadoop-yarn/path/to/application/  does not have any log files

应用程序完成后,您可以尝试使用相同的命令 yarn logs -applicationId <application ID> 查看日志。

要列出所有 已完成 的应用程序,请使用

yarn application -list -appStates FINISHED

或列出所有应用程序

yarn application -list -appStates ALL

在 hadoop 2.3.2 及更高版本中,您可以在 yarn-site.xml:

中使用此配置在 运行 作业上每小时进行一次日志聚合
<property>
    <name>yarn.nodemanager.log-aggregation.roll-monitoring-interval-seconds</name>
    <value>3600</value>
</property>

有关详细信息,请参阅此内容:https://docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.3.2/bk_yarn_resource_mgt/content/ref-375ff479-e530-46d8-9f96-8b52dadb5183.1.html

根本原因:启用日志聚合后,默认情况下,每个用户的应用程序日志将放置在目录 hdfs:///app-logs//日志/。默认情况下,只有提交作业的用户和 hadoop 组的成员才能访问日志文件。在下面的示例目录列表中,您可以看到权限为 770。除了 hadoop 组的所有者和成员之外,任何人都没有访问权限。

[root@mycluster ~]$ hdfs dfs -ls /app-logs

Found 3 items

drwxrwx---    - hive      hadoop    0 2017-03-10 15:33 /app-logs/hive

drwxrwx---    - user1     hadoop          0 2017-03-10 15:37 /app-logs/user1

drwxrwx---    - spark     hadoop          0 2017-03-10 15:39 /app-logs/spark

解决方案:上面的消息可能是骗人的,并不一定表示日志聚合尚未启用。要获取应用程序的 yarn 日志,必须以提交应用程序的用户身份执行 'yarn logs' 命令。在下面的示例中,应用程序是由 user1 提交的。如果我们作为用户 'user1' 执行与上面相同的命令,如果启用了日志聚合,我们应该得到以下输出。

yarn logs -applicationId application_1473860344791_0001
16/09/19 23:10:33 INFO impl.TimelineClientImpl: Timeline service address: http://mycluster.somedomain.com:8188/ws/v1/timeline/
16/09/19 23:10:33 INFO client.RMProxy: Connecting to ResourceManager at mycluster.somedomain.com/192.168.1.89:8050
16/09/19 23:10:34 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library
16/09/19 23:10:34 INFO compress.CodecPool: Got brand-new decompressor [.deflate]
Container: container_e03_1473860344791_0001_01_000001 on mycluster.somedomain.com_45454
LogType:stderr
Log Upload Time:Wed Sep 14 09:44:15 -0400 2016
LogLength:0
Log Contents:
End of LogType:stderr

REFERENCE:以下文档描述了如何使用日志聚合为 long-running YARN 应用程序收集日志。 http://docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.5.0/bk_yarn-resource-management/content/ch_log_a...