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