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

版權聲明:本文爲博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/andrewgb/article/details/50621006
背景:

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

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

客戶端向 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 運行過該作業的的節點都會產生這個目錄存放相應的日誌。

container_1453984687920_0004_01_000002 
——在作業準備運行階段,已經向 ResourceManager 申請過運行作業需要的 container ,作業運行時包含的所有 container 點都會在 application_id 目錄下再創建一個 自己對應的 container_id 的目錄。

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

怎樣才能知道 MapReduce 作業的 MRAppmaster 運行在哪個節點呢?有很多種方法,例如通過 jps 命令查看進程。不過最好的方法是通過訪問主節點的 8088 端口來查看所有作業的運行情況,會顯示 MRAppMaster 運行在哪個節點上。
————————————————
版權聲明:本文爲CSDN博主「andrewgb」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/andrewgb/article/details/50621006

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章