通过日志聚合将作业日志存储在HDFS中

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 如何通过配置Hadoop的日志聚合功能,将作业日志存储在HDFS中以实现长期保留,并详细说明了相关配置参数和访问日志的方法。

作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。

一.启用日志聚合功能

  在默认情况下,Hadoop将所有日志存储在运行作业任务的节点上。在特定时间段后应用程序日志会被自动删除。可以配置日志聚合功能,将日志存储在HDFS中来长久保留日志信息。

  日志聚合意味着一旦作业完成,Hadoop会自动聚合运行作业任务的所有节点的作业日志,并将它们移动到HDFS。日志记录是一个与YARN相关的特性。

  在默认情况下禁用日志聚合功能,但可以通过在"${HADOOP_HOME}/etc/hadoop/yarn-site.xml"文件中设置yarn.log-aggregation-enable参数来启用:
      <property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
        <description>
          每个DataNode上的NodeManager使用此属性来聚合应用程序日志。默认值为"false",启用日志聚合时,Hadoop收集作为应用程序一部分的每个容器的日志,并在应用完成后将这些文件移动到HDFS。
          可以使用"yarn.nodemanager.remote-app-log-dir"和"yarn.nodemanager.remote-app-log-dir-suffix"属性来指定在HDFS中聚合日志的位置。
        </description>
      </property>

  由于在默认情况下禁用日志聚合功能,因此yarn.log-aggregation-enable参数的默认值为"false"。一旦启用日志聚合,还需要关注其他的事情,以确保日志聚合工作正常。  

  温馨提示:  
    日志聚合提供了许多有用的功能,但这需要配置,因为默认是禁用日志聚合功能的。  
    用户和管理员通常需要对作业日志进行历史Fenix,而不是尝试设置自定义的日志收集过程,只需启用日志聚合,以便自动在HDFS中存储作业日志,存储的时间长短也可以设置。

二.Hadoop存储聚合日志的位置

1>.指定NodeManager在HDFS集群中存储聚合日志的位置

  启用日志聚合后,NodeManager会将所有容器日志连接到一个文件中并将它保存在HDFS中。它也会在间隔"${yarn.nodemanager.delete.debug-delay-sec}"秒后从本地目录(由"${yarn.nodemanager.log-dirs}"属性指定)中删除本地日志。

  可以使用"${yarn.nodemanager.remote-app-log-dir}"属性配置Hadoop在HDFS的哪里存储聚合的日志,如下所示:
    <property>
      <name>yarn.nodemanager.remote-app-log-dir</name>
      <value>/yinzhengjie/logs/nodemanager/aggregation</value>
      <description>
        此属性是指定NodeManager在HDFS集群中存储聚合日志的位置。JobHistoryServer将应用日志存储在HDFS中的此目录中。默认值为"/tmp/logs"
        如果将这些日志存储在各个NodeManager节点的本地文件系统中,则JobHistoryServer和其他Hadoop守护进程将无法访问并使用这些日志,这是将它们存储在HDFS中的原因。
      </description>
    </property>

  温馨提示:
    yarn.nodemanager.remote-app-log-dir属性用来设置存储聚合日志文件的根HDFS目录的位置,实际的日志文件会存储在执行作业的用户命名的子目录下。  
    每个用户将其聚合日志存储在HDFS中的"${yarn.nodemanager.remote-app-log-dir}/${user.name}/"文件夹中, 如下图所示。

2>.设置HDFS远程日志目录的名称

  可以使用"yarn.nodemanager.remote-app-log-dir-suffix"属性设置HDFS中远程目录的名称,若不指定该参数属性,默认值为"logs",如上图所示。

  我们可以自定义"yarn.nodemanager.remote-app-log-dir-suffix"的属性值,远程目录日志将创建在"${yarn.nodemanager.remote-app-log-dir}/${user.name}/${yarn.nodemanager.remote-app-log-dir-suffix}",如下所示。
    <property>
      <name>yarn.nodemanager.remote-app-log-dir-suffix</name>
      <value>yinzhengjie-logs</value>
      <description>远程日志目录将创建在"${yarn.nodemanager.remote-app-log-dir}/${user.name}/${yarn.nodemanager.remote-app-log-dir-suffix}",该属性默认值为"logs"。</description>
    </property>

  温馨提示:  
    一个特定的应用程序的实际HDFS位置是"${yarn.nodemanager.remote-app-log-dir}/${user.name}/${yarn.nodemanager.remote-app-log-dir-suffix}/<application ID>",如下图所示。

三.配置日志保留时间

  我们需要在"${HADOOP_HOME}/etc/hadoop/yarn-site.xml"配置文件中定义日志保留时间。下面几个参数需要我们重点关心一下哟~

  在禁用日志聚合功能是,以下两个参数指定日志保留的时间和日志删除行为:
    yarn.nodemanager.log.retain-seconds:
      指定日志保留的时间周期,以秒为单位,默认10800,即3小时。
    yarn.nodemanager.log.deletion-threads-count:
      指定日志用于清理日志的线程数,默认值为4。

  在启用日志聚合功能后,上述两个参数全部时效,以下是日志保留配置参数将生效:
    yarn.log-aggregation.retain-seconds:
      日志删除HDFS日志聚合的时间,若将此参数设置为一个负数(例如默认值为-1),则永久不删除日志,这意味着应用程序的日志聚合所占的空间会不断的增长,从而造成HDFS集群的资源过度使用。
    yarn.log.server.url:  
      指定应用程序(例如:MRAppMaster,SparkAppMaster等等)运行完成后可以访问聚合日志的URL,若不指定,默认值为空。

  温馨提示:
    如果作业历史记录文件比你用"mapreduce.jobhistory.max-age-ms"属性配置的作业历史文件还要大,则其会被删除。此属性的默认值为"604800000毫秒"(即1周)。

1>.yarn.nodemanager.log.retain-seconds

    <property>
        <name>yarn.nodemanager.log.retain-seconds</name>
        <value>10800</value>
        <description>
            指定在单节点上保留用户日志的时间(以秒为单位)。需要注意的是,仅在禁用日志聚合的情况下此属性值才生效,默认值为:10800s(即3小时)。
            启用日志聚合功能后,用户运行完作业时,日志将移动到HDFS集群"${yarn.nodemanager.remote-app-log-dir}/${user.name}/${yarn.nodemanager.remote-app-log-dir-suffix}/"目录下。
            当达到"${yarn.nodemanager.delete.debug-delay-sec}"指定阈值后,立即删除存储在本地目录的日志文件。
        </description>
     </property>

2>.yarn.nodemanager.log.deletion-threads-count

    <property>
        <name>yarn.nodemanager.log.deletion-threads-count</name>
        <value>8</value>
        <description>指定NodeManager用于清理日志的线程数,需要注意的是,仅在禁用日志聚合的情况下此属性值才生效,默认值为:4,通常设置为当前操作系统的cores即可。</description>
    </property>

3>.yarn.log-aggregation.retain-seconds

    <property>
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>604800</value>
        <description>
            此属性设置保留日志聚合的时间(以秒为单位),时间到后自动删除。设置为一个负数(如默认值-1)会禁止删除日志。
            我此处将该参数的值设置为604800,将聚合的应用程序日志保留7天。如果设置非常长的保留时间,日志会占用大量昂贵的HDFS存储空间(尤其是在公有云上,是按容量收费的)。 
            当然,你也可以考虑设置为1209600(14天),比如放国庆或者是年假,有可能等你回公司想要查询你休假期间某个日志的运行情况,可以考虑设置的更长哟,不过通常情况下,7天很合适。
        </description>
    </property>

4>.yarn.log.server.url

    <property>
        <name>yarn.log.server.url</name>
        <value>http://hadoop105.yinzhengjie.com:19888/yinzhengjie/history_logs/aggregation</value>
        <description>
            指定应用程序(例如:MRAppMaster,SparkAppMaster等等)运行完成后可以访问聚合日志的URL。NameNodes将WebUI用户重定向到此URL,并且指向MapReduce作业历史记录。若不指定,默认值为空。
            需要注意的是,若配置该参数,通常需要我们启用History服务哟~
        </description>
    </property>

5>.mapreduce.jobhistory.max-age-ms

  温馨提示:
    如果你想将"yarn.log-aggregation.retain-seconds"的属性值设置大于7天的话,请记得修改如下图所示的属性。该属性用于运行历史清理程序时,将删除早于此毫秒的作业历史文件。
    注意哈,该属性在"${HADOOP_HOME}/etc/hadoop/mapred-site.xml"文件中来修改哟~

四.访问存储在HDFS中的日志文件

1>.访问特定应用程序日志

  经过上面的配置,重启YARN集群和HistoryServer服务后立即生效。现在就可以访问HDFS中实际日志文件了,可以访问特定节点的聚合日志并下载到本地,如下图所示。

2>.查看下载到本地的日志文件

3>.直接在HDFS集群上查看数据无需下载到本地

  以下是某个作业的特定节点上典型日志聚合文件示例。

五.通过多种方式查看应用程序日志

1>.使用yarn logs命令获取应用日志案例

[root@hadoop102.yinzhengjie.com ~]# hdfs dfs -ls /yinzhengjie/logs/nodemanager/aggregation/root/yinzhengjie-logs
Found 20 items
drwxrwx---   - root root          0 2020-11-09 04:04 /yinzhengjie/logs/nodemanager/aggregation/root/yinzhengjie-logs/application_1604865780137_0001
drwxrwx---   - root root          0 2020-11-09 04:04 /yinzhengjie/logs/nodemanager/aggregation/root/yinzhengjie-logs/application_1604865780137_0002
drwxrwx---   - root root          0 2020-11-09 04:04 /yinzhengjie/logs/nodemanager/aggregation/root/yinzhengjie-logs/application_1604865780137_0003
drwxrwx---   - root root          0 2020-11-09 04:05 /yinzhengjie/logs/nodemanager/aggregation/root/yinzhengjie-logs/application_1604865780137_0004
drwxrwx---   - root root          0 2020-11-09 04:05 /yinzhengjie/logs/nodemanager/aggregation/root/yinzhengjie-logs/application_1604865780137_0005
drwxrwx---   - root root          0 2020-11-09 04:05 /yinzhengjie/logs/nodemanager/aggregation/root/yinzhengjie-logs/application_1604865780137_0006
drwxrwx---   - root root          0 2020-11-09 04:06 /yinzhengjie/logs/nodemanager/aggregation/root/yinzhengjie-logs/application_1604865780137_0007
drwxrwx---   - root root          0 2020-11-09 04:06 /yinzhengjie/logs/nodemanager/aggregation/root/yinzhengjie-logs/application_1604865780137_0008
drwxrwx---   - root root          0 2020-11-09 04:06 /yinzhengjie/logs/nodemanager/aggregation/root/yinzhengjie-logs/application_1604865780137_0009
drwxrwx---   - root root          0 2020-11-09 04:07 /yinzhengjie/logs/nodemanager/aggregation/root/yinzhengjie-logs/application_1604865780137_0010
drwxrwx---   - root root          0 2020-11-09 05:44 /yinzhengjie/logs/nodemanager/aggregation/root/yinzhengjie-logs/application_1604871808583_0001
drwxrwx---   - root root          0 2020-11-09 05:44 /yinzhengjie/logs/nodemanager/aggregation/root/yinzhengjie-logs/application_1604871808583_0002
drwxrwx---   - root root          0 2020-11-09 05:45 /yinzhengjie/logs/nodemanager/aggregation/root/yinzhengjie-logs/application_1604871808583_0003
drwxrwx---   - root root          0 2020-11-09 05:45 /yinzhengjie/logs/nodemanager/aggregation/root/yinzhengjie-logs/application_1604871808583_0004
drwxrwx---   - root root          0 2020-11-09 05:45 /yinzhengjie/logs/nodemanager/aggregation/root/yinzhengjie-logs/application_1604871808583_0005
drwxrwx---   - root root          0 2020-11-09 05:46 /yinzhengjie/logs/nodemanager/aggregation/root/yinzhengjie-logs/application_1604871808583_0006
drwxrwx---   - root root          0 2020-11-09 05:46 /yinzhengjie/logs/nodemanager/aggregation/root/yinzhengjie-logs/application_1604871808583_0007
drwxrwx---   - root root          0 2020-11-09 05:46 /yinzhengjie/logs/nodemanager/aggregation/root/yinzhengjie-logs/application_1604871808583_0008
drwxrwx---   - root root          0 2020-11-09 05:47 /yinzhengjie/logs/nodemanager/aggregation/root/yinzhengjie-logs/application_1604871808583_0009
drwxrwx---   - root root          0 2020-11-09 05:47 /yinzhengjie/logs/nodemanager/aggregation/root/yinzhengjie-logs/application_1604871808583_0010
[root@hadoop102.yinzhengjie.com ~]# 
[root@hadoop102.yinzhengjie.com ~]# 
[root@hadoop102.yinzhengjie.com ~]# ll
total 0
[root@hadoop102.yinzhengjie.com ~]# 
[root@hadoop102.yinzhengjie.com ~]# yarn logs -applicationId application_1604865780137_0010 > application_1604865780137_0010.log
20/11/09 06:11:16 INFO client.RMProxy: Connecting to ResourceManager at hadoop101.yinzhengjie.com/172.200.6.101:8032
Unable to get ApplicationState. Attempting to fetch logs directly from the filesystem.
[root@hadoop102.yinzhengjie.com ~]# 
[root@hadoop102.yinzhengjie.com ~]# ll
total 72
-rw-r--r-- 1 root root 70550 Nov  9 06:11 application_1604865780137_0010.log
[root@hadoop102.yinzhengjie.com ~]# 
[root@hadoop102.yinzhengjie.com ~]#

[root@hadoop102.yinzhengjie.com ~]# yarn logs -applicationId application_1604865780137_0010 > application_1604865780137_0010.log

2>.作业完成后,在JobHistoryServer UI查看

  如下图所示,当作业运行完成后,我们可以登录到节点上去通过命令行查看应用程序日志信息,也可以通过JoubHistory的Web UI查看日志信息(比如:http://hadoop105.yinzhengjie.com:19888/jobhistory)。

  温馨提示:  
    通常情况下,我们只需要访问ResourceManager Web UI,找到对应的应用程序,而后根据相应的链接就可以访问应用程序的日志哟~

3>.通过NameNode的WebUI查看应用程序日志

  关于命令行如何查看HDFS的应用程序日志,包括文件下载之类的,我已经在之前的笔记分享过,这里就不多做赘述啦~

  博主推荐阅读:
    https://www.cnblogs.com/yinzhengjie2020/p/12459595.html

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
1月前
|
存储 SQL 监控
|
2月前
|
存储 消息中间件 大数据
大数据-69 Kafka 高级特性 物理存储 实机查看分析 日志存储一篇详解
大数据-69 Kafka 高级特性 物理存储 实机查看分析 日志存储一篇详解
47 4
|
2月前
|
存储 消息中间件 大数据
大数据-70 Kafka 高级特性 物理存储 日志存储 日志清理: 日志删除与日志压缩
大数据-70 Kafka 高级特性 物理存储 日志存储 日志清理: 日志删除与日志压缩
51 1
|
2月前
|
存储 消息中间件 大数据
大数据-68 Kafka 高级特性 物理存储 日志存储概述
大数据-68 Kafka 高级特性 物理存储 日志存储概述
33 1
|
2月前
|
SQL 分布式计算 Hadoop
Hadoop-19 Flume Agent批量采集数据到HDFS集群 监听Hive的日志 操作则把记录写入到HDFS 方便后续分析
Hadoop-19 Flume Agent批量采集数据到HDFS集群 监听Hive的日志 操作则把记录写入到HDFS 方便后续分析
53 2
|
2月前
|
分布式计算 资源调度 数据可视化
Hadoop-06-Hadoop集群 历史服务器配置 超详细 执行任务记录 JobHistoryServer MapReduce执行记录 日志聚合结果可视化查看
Hadoop-06-Hadoop集群 历史服务器配置 超详细 执行任务记录 JobHistoryServer MapReduce执行记录 日志聚合结果可视化查看
50 1
|
2月前
|
存储 监控 固态存储
如何监控和优化 WAL 日志文件的存储空间使用?
如何监控和优化 WAL 日志文件的存储空间使用?
|
3月前
|
存储 SQL 专有云
支持配置审计日志的存储数据库
审计日志作为企业监管平台的重要依据,同时也是“等保三级”认证的必要考察项之一。Dataphin V4.3版本支持设置平台日志的存储数据源,帮助用户快速获取审计日志,同时介绍了不同部署模式的Dataphin如何查看审计日志的方法。
135 5
|
3月前
|
存储 监控 数据可视化
SLS 虽然不是直接使用 OSS 作为底层存储,但它凭借自身独特的存储架构和功能,为用户提供了一种专业、高效的日志服务解决方案。
【9月更文挑战第2天】SLS 虽然不是直接使用 OSS 作为底层存储,但它凭借自身独特的存储架构和功能,为用户提供了一种专业、高效的日志服务解决方案。
179 9
|
1月前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
282 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
下一篇
DataWorks