zoukankan      html  css  js  c++  java
  • Hadoop2.9下运行JAR包时System.out.println的输出日志

    根据博文——Hadoop日志存放路径详解中所述,Container日志包含ApplicationMaster日志和普通Task日志(关于其他类型的日志的详细说明请参考该博文,本文不再赘述)

    所以可知,System.out.println的输出日志是属于Mapreduce程序的Container日志的普通Task日志

    以下配置均在yarn-site.xml中,可在官网上查看默认配置的说明:http://hadoop.apache.org/docs/r2.9.0/hadoop-yarn/hadoop-yarn-common/yarn-default.xml

    Container日志的在本地文件系统中的存放路径

    日志默认位于${HADOOP_HOME}/logs/userlogs

    配置项如下:

    <property>
            <name>yarn.nodemanager.log-dirs</name>
            <value>${yarn.log.dir}/userlogs</value>
            <description>应用程序的本地化的日志目录</description>
    </property>

    官网上对该配置项的描述如下:

        Where to store container logs. An application's localized log directory will be found in ${yarn.nodemanager.log-dirs}/application_${appid}. Individual containers' log directories will be below this, in directories named container_{$contid}. Each container directory will contain the files stderr, stdin, and syslog generated by that container.

    根据博文——Hadoop日志到底存在哪里?中所述,Container日志存放在目录${HADOOP_HOME}/logs/userlogs/application_xxx下,其中ApplicationMaster日志目录名称为container_xxx_000001,普通task日志目录名称则为container_xxx_000002container_xxx_000003,….,每个目录下包含三个日志文件:stdoutstderrsyslog,且具体含义是一样的。(事实上,还有两个文件,prelaunch.outprelaunch.err,不知是不是2.9版本的原因)

    Container日志的在HDFS文件系统中的存放路径

    1. 开启日志聚合

    配置项如下:

    <property>
            <name>yarn.log-aggregation-enable</name>
            <value>True</value>
            <description>启用日志聚合,默认值为False,即禁用</description>
    </property>

    官网上对该配置项的描述如下:

        Whether to enable log aggregation. Log aggregation collects each container's logs and moves these logs onto a file-system, for e.g. HDFS, after the application completes. Users can configure the "yarn.nodemanager.remote-app-log-dir" and "yarn.nodemanager.remote-app-log-dir-suffix" properties to determine where these logs are moved to. Users can access the logs via the Application Timeline Server.

    2. 日志路径

    日志默认位于${fs.defaultFS}/tmp/logs/${user}/logs

    eg. 我的${fs.defaultFS}在core-site.xml中配置的值为hdfs://Master:9000,用户名为hadoop,所以我的日志位于hdfs://Master:9000/tmp/logs/hadoop/logs

    配置项如下:

    <property>
            <name>yarn.nodemanager.remote-app-log-dir</name>
            <value>/tmp/logs</value>
            <description>日志聚合路径</description> 
    </property>
    <property>
            <name>yarn.nodemanager.remote-app-log-dir-suffix</name>
            <value>logs</value>
            <description>当前用户的日志存放位置</description> 
    </property>

    官网上对该配置项的描述如下:

        Where to aggregate logs to.

        The remote log dir will be created at {yarn.nodemanager.remote-app-log-dir}/${user}/{thisParam}

    注意:

    1. 只有作为数据节点的主机(即存在进程DataNode)的文件系统中才会在运行Mapreduce程序时被建立路径${HADOOP_HOME}/logs/userlogs

    2. 当启用了日志聚合时,日志会存放到HDFS文件系统中,只能通过web用户界面查看,本地节点的文件系统中,路径${HADOOP_HOME}/logs/userlogs虽然存在,但是为空

    接下来,关于注意的两点,来进行解释,同时详细说明查看System.out.println的输出日志的两种方式,即在本地查看&在web用户界面查看。

    测试的JAR包的源码其实只是在wordCount代码的基础上增加了一些System.out.println语句,详见本人的另一篇博文:

    MapReduce程序——WordCount(Windows_Eclipse + Ubuntu14.04_Hadoop2.9.0)

    一、在本地查看System.out.println的输出日志

    1. 配置/usr/local/hadoop/etc/hadoop/yarn-site.xml

    <configuration>
            <property>
                    <name>yarn.resourcemanager.hostname</name>
                    <value>Master</value>
                    <description>ResourceManager的主机名</description>
            </property>
            <property>
                    <name>yarn.nodemanager.aux-services</name>
                    <value>mapreduce_shuffle</value>
                    <description>NodeManager的辅助服务</description>
            </property>
            <property>
                    <name>yarn.log-aggregation-enable</name>
                    <value>False</value>
                    <description>禁用日志聚合,默认值也为False,这条配置项可不写</description>
            </property>
            <property>
                    <name>yarn.nodemanager.log-dirs</name>
                    <value>/home/hadoop/Hadoop_test/userlogs</value>
                    <description>应用程序的本地化的日志目录,默认值为${yarn.log.dir}/userlogs,为了测试该条配置项是否起了作用,我进行了修改</description>
            </property>
    </configuration>

    2. 初始化Hadoop工作环境

    具体操作见本人另一篇博文:ubuntu14.04搭建Hadoop2.9.0集群(分布式)环境的第八节——“八、更改配置或初始化工作环境”

    3. 运行JAR包

    $ hadoop jar wordCount.jar wordCount.WordMain

    可以看到,在Main方法里面的部分都可以在终端输出,而一旦程序进入Mapper和Reducer的部分,这个时候在集群上运行,任务是分发到DataNode的主机里面跑,就不会在终端显示了,所以在Mapper和Reducer里面的是无法看到的。

    我们需要去自己定义的日志目录下,查看打印信息。

    4. 查看任务分发运行情况

    我们先去web用户界面http://master:8088/cluster查看任务分发运行情况

    点击History

    上面的红框的logs是ApplicationMaster日志

    点击Maps和Reduces后面的数字链接,就能看到每个任务运行的情况

    可以看到,Maps和Reduces均运行在主机Slave1

    点击后面的logs链接,会报错如下:

    因为我们未启用日志聚合,具体的说明见本文第二节——二、在web用户界面查看System.out.println的输出日志

    5. 查看日志信息

    现在我们可以去主机Slave1中查看打印信息了

    路径~/Hadoop_test/userlogs是自动生成的

    进入文件夹application_xxx内,ApplicationMaster日志目录名称为container_xxx_000001,普通task日志目录名称则为container_xxx_000002container_xxx_000003,….

    每个目录下包含五个日志文件:prelaunch.outprelaunch.errstdoutstderrsyslog,System.out.println的输出日志就在文件stdout

    6. 其他主机的情况

    Master——不是数据节点——不存在路径~/Hadoop_test/userlogs

    Slave2——虽然是数据节点,但是未运行MapReduce程序——自动生成路径~/Hadoop_test/userlogs,但是为空

    二、在web用户界面查看System.out.println的输出日志

    1. 配置/usr/local/hadoop/etc/hadoop/yarn-site.xml

    <configuration>
            <property>
                    <name>yarn.resourcemanager.hostname</name>
                    <value>Master</value>
                    <description>ResourceManager的主机名</description>
            </property>
            <property>
                    <name>yarn.nodemanager.aux-services</name>
                    <value>mapreduce_shuffle</value>
                    <description>NodeManager的辅助服务</description>
            </property>
            <property>
                    <name>yarn.log-aggregation-enable</name>
                    <value>True</value>
                    <description>启用日志聚合,默认值为False,即禁用</description>
            </property>
            <property>
                    <name>yarn.nodemanager.log-dirs</name>
                    <value>/home/hadoop/Hadoop_test/userlogs</value>
                    <description>应用程序的本地化的日志目录,默认值为${yarn.log.dir}/userlogs,为了测试该条配置项是否起了作用,我进行了修改</description>
            </property>
    </configuration>

    2. 初始化Hadoop工作环境

    3. 运行JAR包

    4. 查看任务分发运行情况

    以上操作与第一节相同

    可以看到,Maps运行在主机Slave2,Reduces运行在主机Slave1

    5. 查看日志信息

    点击logs链接,因为启用了日志聚合,不会再报错了,而是显示出日志信息

    用命令行查看

    hdfs dfs -ls hdfs://Master:9000/tmp/logs/hadoop/logs

    每个节点的各个类型的日志全部聚合成了一个文件,可以直接查看

    hdfs dfs -cat XXX

    6. 主机的情况

    Master——不是数据节点——不存在路径~/Hadoop_test/userlogs

    Slave1——虽然是数据节点,并运行了MapReduce程序,但是由于启用了日志聚合,日志未存储在本地——自动生成路径~/Hadoop_test/userlogs,但是为空

    Slave2——虽然是数据节点,并运行了MapReduce程序,但是由于启用了日志聚合,日志未存储在本地——自动生成路径~/Hadoop_test/userlogs,但是为空

    以上

  • 相关阅读:
    apache安全—用户访问控制
    hdu 3232 Crossing Rivers 过河(数学期望)
    HDU 5418 Victor and World (可重复走的TSP问题,状压dp)
    UVA 11020 Efficient Solutions (BST,Splay树)
    UVA 11922 Permutation Transformer (Splay树)
    HYSBZ 1208 宠物收养所 (Splay树)
    HYSBZ 1503 郁闷的出纳员 (Splay树)
    HDU 5416 CRB and Tree (技巧)
    HDU 5414 CRB and String (字符串,模拟)
    HDU 5410 CRB and His Birthday (01背包,完全背包,混合)
  • 原文地址:https://www.cnblogs.com/VeryGoodVeryGood/p/8574757.html
Copyright © 2011-2022 走看看