Hadoop 之日誌管理—應用在 YARN 中運行時的日誌

背景:app

在寫這篇博文前,本身一直沒有弄明白一個問題,「在 Map 函數和 Reduce 函數中使用 System.out.print 打印日誌時,輸出內容在哪裏顯示?」。試了好多回,在 log/* 目錄下找了好久都沒有找到,而且嘗試了不少次去找,都沒有成功。這讓我想經過此方法調試 Map/Reduce 函數以失敗了結。函數

最後,一次偶然的機會讓我發現了關於日誌的玄機。經過本身的觀察和閱讀參考書籍,終於弄明白了。oop


客戶端向 YARN 提交 MapReduce 做業運行時,會創建 Container 運行日誌,並保存在本地磁盤(不是 HDFS 中),默認狀況下,日誌目錄爲 logs/userlogs/ 。此目錄下的內容爲各個做業運行時在本節點上所創建的 log 目錄結構,此層由 「application 」 加 「id」 組成文件夾名,進入此文件夾後,在此層看到的是由 「conainer」 加 「id」 組成的文件夾,進入此文件夾後,在此層有三個文件:stderr(異常輸出),stdout(標準輸出),syslog(運行日誌)。調試

有時,咱們但願使用 System.out.println 來查看運行過程當中的某些值的狀況,因此,咱們要找到這個輸出要在哪裏才能看到。日誌

下面來考究一下這個問題~ 
Hadoop 在 MapReduce 中使用 System.out.println 打印內容時,內容輸出地址爲 MRAppMaster 運行的節點上,目錄爲 logs/userlogs/application_1453984687920_0004/container_1453984687920_0004_01_000002進程

注: 
application_1453984687920_0004 
——爲對應的 application_id,Hadoop 集羣中全部配合 MRAppMaster 運行過該做業的的節點都會產生這個目錄存放相應的日誌。io

container_1453984687920_0004_01_000002 
——在做業準備運行階段,已經向 ResourceManager 申請過運行做業須要的 container ,做業運行時包含的全部 container 點都會在 application_id 目錄下再建立一個 本身對應的 container_id 的目錄。ast

而後在 container_id 這個目錄下存放着三個不一樣的文件輸出:stderr(異常輸出),stdout(標準輸出),syslog(運行日誌)。 
注意,在 MapReduce 程序裏書寫 System.out.print 時,會輸出到stdout 中,而且只在 MRAppMaster 運行的節點上的 container_id 目錄下的 stdout 文件中才會有 。集羣

怎樣才能知道 MapReduce 做業的 MRAppMaster 運行在哪一個節點呢?有不少種方法,例如經過 jps 命令查看進程。不過最好的方法是經過訪問主節點的 8088 端口來查看全部做業的運行狀況,會顯示 MRAppMaster 運行在哪一個節點上。書籍

相關文章
相關標籤/搜索