Hadoop中的日志包含三個部分,Application Master產生的運行日志和Container的日志。
一、ApplicationMaster產生的作業運行日志
Application Master產生的日志信息詳細記錄了Map Reduce job的啟動時間,運行時間,用了多少個Mapper,多少個Reducer,Counter等等信息。MapReduce作業中的Application Master是運行在container中的。
默認情況下,Application Master產生的日志信息保存在HDFS上的特定的路徑下,由以下幾個參數來決定。
yarn.app.mapreduce.am.staging-dir : 默認為/tmp/hadoop-yarn/staging
mapreduce.jobhistory.done-dir : 存放已經結束的MR job的日志,默認為${yarn.app.mapreduce.am.staging-dir}/history/done
mapreduce.jobhistory.intermediate-done-dir : 存放正在運行中的MR job的日志,默認為${yarn.app.mapreduce.am.staging-dir}/history/done_intermediate
到達HDFS目錄下查看后發現,每個MR job都包含兩個文件,一個是.jobhist結尾的文件,一個conf.xml
打開一個jhist查看,前半部分是avsc文件,描述了數據文件的結構,例如包含了什么字段,每個字段的數據類型以及possible value.
后面的部分則是json格式的數據,描述了MapReduce Job的運行狀態和日志信息。
打開conf.xml可以發現,這個xml文件中包含了這個MapReduce job的參數。
二、Container日志
Container日志存放在每個NodeManager的本地磁盤上,存放位置由參數 yarn.nodemanager.log-dirs 決定,默認是$HADOOP_HOME/logs/userlogs下。這里包含了每一個application的log.
每一個以application命名的文件夾下,包含三個container的文件夾,以0000001結尾的文件夾下的文件就是ApplicationMaster的運行日志。
每個container文件夾下都包含三個文件,syserr,sysout, syslog
三、日志聚集功能
因為container的運行日志保存在每個NodeManager的本地磁盤下,不方便管理,可以啟用日志聚集功能,打開該功能后,container的日志會被上傳到HDFS某個目錄下,並將syserr,sysout和syslog合並成一個文件,可以通過jobhistory server來查看,在沒有啟用日志聚集的功能時,在jobhistory server的Web UI里是沒辦法查看某個Map或者Reduce的日志的。
並且用"yarn logs -applicationId xxxx" 命令嘗試輸出yarn的log,log是沒辦法顯示的。
在每個NodeManager的yarn-site.xml中配置以下參數。
1.yarn.log-aggregation-enable
是否啟用日志聚集功能,默認值為false
2.yarn.log-aggregation.retain-seconds
在HDFS上聚集的日志最多保存多長時間,默認值為-1,-1的意思是不刪除?
3.yarn.log-aggregation.retain-check-interval-seconds
隔多長時間查看聚集的日志並刪除已經超過時間的日志,默認值為-1。如果設置成0或者一個負數,則這個值會被計算成log保留時間的十分之一。
4.yarn.nodemanager.remote-app-log-dir
日志被轉移到的HDFS路徑,默認值為/tmp/logs
5.yarn.nodemanager.remote-app-log-dir-suffix
日志被轉移到的HDFS路徑的子目錄,默認為logs, 所以默認情況下日志會被存放在${yarn.nodemanager.remote-app-log-dir}/${user}/logs下。
其他參數可以參考https://hadoop.apache.org/docs/r2.4.1/hadoop-yarn/hadoop-yarn-common/yarn-default.xml
接下來我們來驗證一下,如果yarn.log-aggregation.retain-seconds設置成-1,也就是默認值,會不會進行日志聚集呢?
此時我在ResourceManager和NodeManager的yarn-site.xml都加入了以下的參數。
接下來重啟yarn,並且跑一個MapReduce Job試試。
此時我們可以在jobhistory server中查看到這個job的log.
過十分鍾左右再來查看,log還在,並且查看HDFS路徑/tmp/logs/root/logs,所有的log文件都在此處。
參考文章:
https://blog.csdn.net/u011414200/article/details/50338073