Mapreduce,mapper任务无输出以及相关问题解决,日志的正确用法
問題提出
1.輸出空文件之前遇到過ArrayIndexOutOfBoundsException->數組越界的錯誤,解決也很簡單:加上判斷語句 。其實當時是有些懷疑是不是讀取數據錯誤了,但是考慮可能是最后一行空值數據被讀到了導致出現的這個錯誤,就沒往下想。
2).在執行MR任務時,mapper和reducer都正常運行,但是hdfs輸出文件為空。(任務是關于MR執行排序任務的)
數據如下:
排查經歷
1.查看core-site.xml是不是路徑(hadoop.tmp.dir屬性)配置錯誤了,導致數據放錯了位置。然而 不是
2.因為沒有報錯所以排除了是集群的問題。然后就是考慮的是可能程序錯誤了,但是一直沒有發現錯誤。期間也嘗試過重寫輸入文本,重寫MR程序,重新打包等操作。
3.注意到了命令行MR程序執行結束后留下的信息:
Mapper的輸出為空(Map output records=0)
這說明錯誤完全是出現在mapper階段
嘗試使用了程序經典的輸出語句標志位,但是因為沒找到它的輸出,就暫時放棄了。本來想使用hadoop本地模式運行MR并使用Debug的方式查找錯誤的,感覺有些復雜就舍棄了。最后網上查詢了如何查看MR程序的println輸出(方法末尾附上)后,發現了問題。
這里需要查看logs文件(如果添加了歷史服務器,則可以直接查看歷史服務器的map任務,找到最新執行的任務,查看logs文件。沒有則見最后查詢logs日志的方法)
println輸出結果如下:
可以發現得到的每一行數據都沒有問題但是得到的數組長度始終為1,說明map任務中的split函數(以“\t”拆分)并沒有將數據拆分。查看輸入文件發現,間距很小。懷疑是間隔符的問題。但是在vim編輯輸入文件時發現確實\t間距就是很小。多次嘗試之后,發現結果:
vim編輯器并不很好適應所有外部文件復制的\t,很可能將其看為空格了。如果出現這種情況要么將數據拿出來使用記事本重新添加\t再復制到vim編輯器中,要么直接使用vim編輯器將間隔修改為\t
修改結束后:MR任務正常運行
Map輸出如下:
MR運行結果如下:
小結
1.重點學會看logs日志文件,從日志文件中我們可以發現很多錯誤,也可以很好幫助我們解決問題。
2.遇到錯誤的時候,先考慮自己翻譯下錯誤,不要忙著找文章看是什么錯誤(之前我就是…),比如數組越界異常ArrayIndexOutOfBoundsException,翻譯過來就很好理解錯誤在哪里了。
3.使用好MR程序添加println輸出的tip,可以提示自己那些位置出錯了,快速反應。
補充查看日志
有歷史服務器(JobHistoryServer)的:
找到最新執行完的MR程序點擊history查看
1.
3.
4.
向下翻就可以找到我們添加的輸出結果,如果不想使用本地的集群運行模式通過debug找錯的,可以使用這個方法。
無歷史服務器的:
打開hdfs web界面,打開/tmp/logs/目錄找到用戶的最新log文件,如圖:
將文件下載下來搜索stdout,一直下一個就可找到相應的輸出結果:
總結
以上是生活随笔為你收集整理的Mapreduce,mapper任务无输出以及相关问题解决,日志的正确用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Dp问题:奶牛的聚会
- 下一篇: paxos协议补充