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

 

 

 

 

以上


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM