0%

YARN 中用户日志的管理和使用

YARN 中用户日志的管理和使用


背景

在以前, 处理应用(application)生成的用户日志已经成了安装 Hadoop 过程中的一个最大痛点.
在 Hadoop 1.x, 用户日志被 TaskTracker 留在每个节点上,
这样长期来看在各个节点上的用户日志的是难于管理并且也很难被获取和使用到的.
YARN 处理日志管理问题的办法是让 NodeManagers(NMs) 提供一个选项,
可以在应用结束后将日志文件安全地移到一个分布式文件系统中, 比如 HDFS.

YARN 中日志聚合的详细描写

NodeManager 就没有像之前 TaskTracker 那样去截断用户日志, 把日志留在每个节点的本地, 它通过提供一个选项可以在应用结束后将日志安全地移动到分布式文件系统中, 比如 HDFS.

  • 对属于同一个应用(Application), 跑在一个 NM 上的所有容器(containers)的日志都会被聚合并写入一个配置好地址的(很可能是压缩过的)日志文件中.

  • 在当前的实现中, 一个应用一结束就会得到如下:

    • 应用级别的日志日志目录 (在 HDFS 上体现 /tmp/logs/{user}/logs)

    • 此节点上该应用的所有的容器的日志文件 (/tmp/logs/{user}/logs 目录下以机器节点区分日志文件)

  • 用户能通过 YARN 的命令行工具, 网页端或者直接从文件系统(FS)中来查看这些日志, 没必要只局限于网页端一种形式.

  • 通过将日志文件存储在分布式文件系统中, 比起第一代的实现, 现在可以让日志文件存储更长的时间.

  • 我们不再需要去截断日志文件, 只要日志文件的长度是合理的, 我们就会保存整个日志文件.

用法

1. 网页端访问(Web UI)

通过网页端访问, 需要知道的事情是, 日志的聚合操作用户是感觉不到的.

当 MapReduce 应用还在执行中时, 用户查看日志是通过 ApplicationMaster UI 来访问的, 后者会自动跳转到 NodeManager UI 上.

一旦应用结束, 所有的日志都会归属到 MapReduce 的 JobHistoryServer 中, 此时将由后者来提供日志访问.

对于 非-MapReduce 应用, 由更一般性质的 ApplicationHistoryServer 来提供一样的日志访问服务.

MR 的作业我用其打开一般看不到实质性的帮助。Spark 的作业打开页面友好。且帮助信息大。

2. 命令行访问

个人比较喜欢命令行访问方式。

要打印出一个给定应用的所有日志, 命令如下

1
yarn logs -applicationId <application ID> -appOwner <userId>

如果只要一个给定容器的所有日志, 可以如下

1
yarn logs -applicationId <application ID> -appOwner <userId> -containerId <Container ID> -nodeAddress <Node Address>

使用命令行工具的一个显著优势是可以使用常规的 shell 工具, 如 grep, sort 等等, 来过滤出我们想要的信息.

管理

1. 日志相关的一般配置项

yarn.nodemanager.log-dirs: 确定当容器还在执行中时, 容器日志在节点上的存储位置, 默认值是 ${yarn.log.dir}/userlogs.

  • 一个应用的本地化日志目录是这样的格式 ${yarn.nodemanager.log-dirs}/application_${appid}

  • 一个独立的容器的日志文件夹会在上面的文件夹下, 文件夹命名格式是这样 container_${containerid}

  • 对于 MapReduce 的应用, 每个容器目录下会包含容器生成的三个文件, stderr, stdin 和 syslog

  • 其他的框架可以自行选择放置多少个日志文件, YARN 对文件名的文件数量都没有限制

yarn.log-aggregation-enable: 选择是否启用日志聚合. 如果不启用聚合, NMs 会把日志存储在节点本地(就像第一代所做的那样).

2. 日志聚合启用后的相关配置

yarn.nodemanager.remote-app-log-dir: 这是 NMs 将日志聚合后存放在默认的文件系统(一般就是 HDFS 上的)上的地址. 这个地址不应是本地的文件系统, 否则日志服务器会无法提供聚合后日志的能力. 默认值是 /tmp/logs.

yarn.nodemanager.remote-app-log-dir-suffix: 日志目录会这样创建 {yarn.nodemanager.remote-app-log-dir}/${user}/{thisParam}, 默认值是 logs.

yarn.log-aggregation.retain-seconds: 配置多久后聚合后的日志文件被删除, 默认是7天,如果配置成 -1 或者一个负值就不会删除聚合日志.

yarn.log-aggregation.retain-check-interval-seconds: 确定多长时间去检查一次聚合日志的留存情况以执行日志的删除. 如果设置为 0 或者负值, 那这个值就会用聚合日志的留存时间的十分之一来自动配置, 默认值是 -1.

3. 日志聚合未启用的相关配置

yarn.nodemanager.log.retain-seconds: 保存在本地节点的日志的留存时间, 默认值是 10800.

yarn.nodemanager.log.deletion-threads-count: 确定 NMs 启动的进程数去删除本地的日志文件.


参考链接