为什么即使启用了日志记录,我的 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
将仅列出处于 SUBMITTED、ACCEPTED[=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>
根本原因:启用日志聚合后,默认情况下,每个用户的应用程序日志将放置在目录 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...
我在 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
将仅列出处于 SUBMITTED、ACCEPTED[=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>
根本原因:启用日志聚合后,默认情况下,每个用户的应用程序日志将放置在目录 hdfs:///app-logs//日志/
[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...