获取运行中Spark应用的Container日志
场景说明
在运行Spark应用时,用户可能遇到任务执行失败、数据倾斜、Container异常退出等问题,需要通过查看Container日志来定位原因。然而,Spark应用的Container日志分散在集群的多个节点上,手动逐台登录节点收集日志效率低下,尤其当集群规模较大时,定位问题Container的日志更加困难。YARN提供了yarn logs命令,可以快速聚合获取运行在YARN上的Spark应用Container日志,帮助用户高效排查问题。
本文适用于以下场景:
- 排查Spark应用任务失败原因,需要查看特定Container的日志。
- 监控Spark应用运行状态,需要批量获取所有Container的日志。
- 应用运行过程中需要实时查看某个Container的日志输出。
使用yarn logs命令获取Container日志
可以通过yarn logs命令获取运行在Yarn上的应用的日志,针对不同的场景,可以使用以下命令获取需要的日志:
- 执行如下命令,获取application的完整日志:
yarn logs --applicationId <appId> -out <outputDir>
其中,<appId> 为Spark应用的ID,<outputDir>为输出日志路径。例如:
yarn logs --applicationId application_1574856994802_0016 -out /opt/test
执行结果:
- 如果该application处于运行状态,则无法获取dead状态的container日志。
- 如果该application处于结束状态,则可以获取全部归档的container日志。
- 执行如下命令,获取指定Container日志:
yarn logs -applicationId <appId> -containerId <containerId>
其中,<containerId>为查看日志的Container ID。例如:
yarn logs -applicationId application_1574856994802_0018 -containerId container_e01_1574856994802_0018_01_000003
执行结果:
- 如果该application处于运行状态,则无法获取dead状态的Container日志。
- 如果该application处于结束状态,则可获取任意Container的日志。
- 执行如下命令,获取任意状态的Container日志:
yarn logs -applicationId <appId> -containerId <containerId> -nodeAddress <nodeAddress>
其中<nodeAddress>为节点IP和端口,可通过以下命令获取:
yarn node -list -all
例如:
yarn logs -applicationId application_1574856994802_0019 -containerId container_e01_1574856994802_0019_01_000003 -nodeAddress 192-168-1-1:8041
执行结果:可获取任意Container的日志。
常见问题
Q:执行yarn logs命令提示“No aggregation enabled for”或日志为空如何处理?
A:该问题通常是因为YARN日志聚合功能未开启。请在yarn-site.xml中确认yarn.log-aggregation-enable参数设置为true,并重启Yarn服务使配置生效。
Q:使用--nodeAddress参数获取运行中Container日志时,提示连接超时怎么办?
A:请检查以下事项:
1. 确认节点IP和端口是否正确,可通过yarn node -list -all命令查看节点地址。
2. 确认客户端与目标节点之间的网络是否互通。
3. 确认目标节点的NodeManager HTTP端口(默认8041)是否开放。
相关文档
- 如需了解YARN日志聚合功能的配置方法,请参见配置Container日志聚合功能。
- MRS集群创建成功后,用户可自行安装集群客户端,用于连接集群内组件服务端,进行组件连接、作业提交等任务。集群客户端可以安装在集群内的节点上,也可以安装在集群外的节点上,具体操作请参考安装MRS客户端。
- 了解Spark常用配置参数的含义和用法,请参考Spark常用配置参数。