
# 获取运行中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上的应用的日志，针对不同的场景，可以使用以下命令获取需要的日志：
1. 执行如下命令，获取application的完整日志：
   ```
   yarn logs --applicationId <appId> -out <outputDir>
   ```
   其中，\<appId\> 为Spark应用的ID，\<outputDir\>为输出日志路径。例如：
   ```
   yarn logs --applicationId application_1574856994802_0016 -out /opt/test
   ```
   执行结果：
   1. 如果该application处于运行状态，则无法获取dead状态的container日志。
   
   2. 如果该application处于结束状态，则可以获取全部归档的container日志。
    
2. 执行如下命令，获取指定Container日志：
   ```
   yarn logs -applicationId <appId> -containerId <containerId>
   ```
   其中，\<containerId\>为查看日志的Container ID。例如：
   ```
   yarn logs -applicationId application_1574856994802_0018 -containerId container_e01_1574856994802_0018_01_000003
   ```
   执行结果：
   1. 如果该application处于运行状态，则无法获取dead状态的Container日志。
   
   2. 如果该application处于结束状态，则可获取任意Container的日志。
    
3. 执行如下命令，获取任意状态的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日志聚合功能](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_0858.html)。
- MRS集群创建成功后，用户可自行安装集群客户端，用于连接集群内组件服务端，进行组件连接、作业提交等任务。集群客户端可以安装在集群内的节点上，也可以安装在集群外的节点上，具体操作请参考[安装MRS客户端](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_2127.html)。
- 了解Spark常用配置参数的含义和用法，请参考[Spark常用配置参数](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_1931.html)。
 
