• 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,但是为空

    以上

  • 相关阅读:
    What Kind of Friends Are You? ZOJ 3960
    博弈随笔(未完待续)
    Mergeable Stack ZOJ
    LIS ZOJ
    差分约束 HDU
    How far away ? HDU
    wya费用流
    不知道说些什么
    ext大法好啊
    bzoj2348
  • 原文地址:https://www.cnblogs.com/VeryGoodVeryGood/p/8574757.html
Copyright © 2020-2023  润新知