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

  • 相关阅读:
    sql优化
    es和solr
    RabbitMQ 整理
    redis分布式缓存
    redis集群
    drf-jwt第三方插件,DRF的三大认证的具体使用,多方式登陆的实现
    自定义路由组件,Django的admin后台管理,DRF的三大认证,jwt认证
    DRF视图家族
    导包补充,深度查询(深度序列化),十大接口
    三流,内部类,基表,表关系,断开表关联,外键字段属性
  • 原文地址:https://www.cnblogs.com/yinzhengjie/p/13943340.html
Copyright © 2020-2023  润新知