zoukankan      html  css  js  c++  java
  • 通过日志聚合将作业日志存储在HDFS中

             通过日志聚合将作业日志存储在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

  • 相关阅读:
    递归函数及Java范例
    笔记本的硬盘坏了
    “References to generic type List should be parameterized”
    配置管理软件(configuration management software)介绍
    WinCE文件目录定制及内存调整
    使用Silverlight for Embedded开发绚丽的界面(3)
    wince国际化语言支持
    Eclipse IDE for Java EE Developers 与Eclipse Classic 区别
    WinCE Heartbeat Message的实现
    使用Silverlight for Embedded开发绚丽的界面(2)
  • 原文地址:https://www.cnblogs.com/yinzhengjie/p/13943340.html
Copyright © 2011-2022 走看看