0%

日志聚集

yarn日志聚集详解:配置、原理与实战

在 Hadoop YARN 中,日志聚集(Log Aggregation)是一项关键功能,用于收集分布式集群中各个节点的任务日志并集中存储,解决了分散日志难以管理和排查问题的痛点。本文将详细解析日志聚集的作用、配置方法、实现原理及最佳实践。

日志聚集的核心作用

在未启用日志聚集时,YARN 任务日志分散存储在各个 NodeManager 节点的本地磁盘(如 $HADOOP_HOME/logs/userlogs/),存在以下问题:

  • 日志分散:需逐个节点登录查看日志,排查问题效率低;
  • 存储风险:NodeManager 节点磁盘空间有限,日志可能被清理或覆盖;
  • 权限问题:用户可能没有节点登录权限,无法直接访问日志。

日志聚集功能通过以下方式解决上述问题:

  • 任务完成后,自动将分散在各节点的日志上传至 HDFS 集中存储;
  • 支持通过 YARN Web UI 或命令行统一查看日志;
  • 可配置日志保留时间,自动清理过期日志,节省存储空间。

日志聚集的配置方法

日志聚集功能需在 yarn-site.xml 中配置,核心参数如下:

核心配置参数

参数 说明 默认值 推荐配置
yarn.log-aggregation-enable 是否开启日志聚集 false true(启用)
yarn.log-aggregation.retain-seconds 日志在 HDFS 中的保留时间(秒) -1(永久保留) 604800(7 天)
yarn.log-aggregation.retain-check-interval-seconds 日志清理检查间隔(秒) -1(由 YARN 自动决定) 86400(1 天)
yarn.nodemanager.remote-app-log-dir 日志在 HDFS 中的存储根目录 /tmp/logs /var/log/hadoop-yarn/apps(自定义路径)
yarn.nodemanager.remote-app-log-dir-suffix 日志目录后缀(通常为用户名) logs logs(保持默认)

完整配置示例

$HADOOP_HOME/etc/hadoop/yarn-site.xml 中添加以下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<!-- 开启日志聚集功能 -->  
<property>
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>

<!-- 日志在 HDFS 中保留 7 天(604800 秒) -->
<property>
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>

<!-- 日志清理检查间隔为 1 天(86400 秒) -->
<property>
<name>yarn.log-aggregation.retain-check-interval-seconds</name>
<value>86400</value>
</property>

<!-- 日志在 HDFS 中的存储路径 -->
<property>
<name>yarn.nodemanager.remote-app-log-dir</name>
<value>/var/log/hadoop-yarn/apps</value>
</property>

<!-- 日志目录后缀(默认使用用户名) -->
<property>
<name>yarn.nodemanager.remote-app-log-dir-suffix</name>
<value>logs</value>
</property>

配置生效步骤

  1. 分发配置文件:若为完全分布式集群,需将修改后的 yarn-site.xml 分发至所有 NodeManager 节点;

  2. 重启 YARN 集群:日志聚集配置对 ResourceManager 和 NodeManager 均生效,需重启 YARN 使配置生效:

    1
    2
    3
    4
    5
    # 停止 YARN  
    $HADOOP_HOME/sbin/stop-yarn.sh

    # 启动 YARN
    $HADOOP_HOME/sbin/start-yarn.sh

日志聚集的工作原理

日志聚集的完整流程分为 日志本地存储、日志上传、日志访问、日志清理 四个阶段:

1. 日志本地存储阶段

  • 任务运行时,YarnChild 进程将日志输出到 NodeManager 节点的本地目录(默认 $HADOOP_HOME/logs/userlogs/<application_id>/<container_id>/);
  • 本地日志包括 stdout(标准输出)、stderr(错误输出)和 syslog(系统日志)。

2. 日志上传阶段

  • 当应用程序(如 MapReduce 作业)完成后,NodeManager 检测到任务终止,触发日志上传;
  • NodeManager 将本地日志压缩后上传至 HDFS 配置的目录(如 /var/log/hadoop-yarn/apps/<username>/logs/);
  • 上传完成后,NodeManager 清理本地日志(可选,由 yarn.nodemanager.log.retain-seconds 控制本地保留时间)。

3. 日志访问阶段

用户可通过两种方式访问聚集后的日志:

YARN Web UI 访问
  1. 打开 YARN Web UI(http://<ResourceManager节点>:8088);
  2. 在 “Applications” 列表中找到目标应用程序,点击 Application ID
  3. 在应用详情页点击 “Logs” 链接,即可查看该应用在各节点的日志。
命令行访问

使用 yarn logs 命令查看日志:

1
2
3
4
5
6
7
8
# 查看指定应用的所有日志  
yarn logs -applicationId <application_id>

# 查看指定容器的日志
yarn logs -applicationId <application_id> -containerId <container_id>

# 查看指定节点的日志
yarn logs -applicationId <application_id> -nodeId <node_id>

4. 日志清理阶段

  • YARN 定期(按 yarn.log-aggregation.retain-check-interval-seconds 配置)检查 HDFS 中的日志文件;
  • 对于超过保留时间(yarn.log-aggregation.retain-seconds)的日志,自动删除以释放 HDFS 空间;
  • 清理操作由 ResourceManager 的 LogAggregationService 组件执行。

日志聚集的实战操作

验证日志聚集功能

  1. 提交一个 MapReduce 任务(如 WordCount);

  2. 任务完成后,检查 HDFS 日志目录是否生成日志文件:

    1
    hdfs dfs -ls /var/log/hadoop-yarn/apps/<username>/logs/  
  3. 通过命令行查看日志:

    1
    yarn logs -applicationId application_1620000000000_0001  

常见问题排查

(1)日志未上传至 HDFS
  • 原因:YARN 未重启,配置未生效;NodeManager 无 HDFS 写入权限;HDFS 空间不足。

  • 解决

    • 确认 yarn.log-aggregation-enable 已设为 true 并重启 YARN;

    • 检查 HDFS 目录权限(确保yarn用户有写入权限):

      1
      hdfs dfs -chmod -R 777 /var/log/hadoop-yarn/apps  
(2)日志访问时报错 “Logs not available yet”
  • 原因:任务刚完成,日志上传尚未完成;或日志上传失败。
  • 解决:等待几分钟后重试;检查 NodeManager 日志($HADOOP_HOME/logs/yarn-<username>-nodemanager-<node>.log)排查上传失败原因。
(3)日志保留时间未生效
  • 原因yarn.log-aggregation.retain-check-interval-seconds 配置过大,清理任务未触发。
  • 解决:将检查间隔设为较小值(如 86400 秒),并重启 ResourceManager。

日志聚集的优化建议

1. 合理设置日志保留时间

  • 生产环境建议保留 7-14 天,避免 HDFS 空间耗尽;
  • 测试环境可缩短保留时间(如 1-3 天)。

2. 配置日志压缩

启用日志压缩可减少 HDFS 存储占用和网络传输量:

1
2
3
4
5
<!-- 配置日志压缩格式(支持 gzip、snappy 等) -->  
<property>
<name>yarn.nodemanager.log-aggregation.compression-type</name>
<value>gz</value>
</property>

3. 分离关键日志与普通日志

对于重要应用,可通过自定义日志目录单独存储,延长保留时间:

1
2
3
4
5
<!-- 为特定应用配置独立日志目录 -->  
<property>
<name>yarn.log-aggregation.application-log-dir</name>
<value>/var/log/hadoop-yarn/apps/important</value>
</property>

4. 监控日志存储占用

定期检查 HDFS 日志目录大小,避免空间溢出:

1
hdfs dfs -du -h /var/log/hadoop-yarn/apps  

欢迎关注我的其它发布渠道

表情 | 预览
快来做第一个评论的人吧~
Powered By Valine
v1.3.10