hadoop mapreduce問題排查和解決

前一陣,由於項目最近在對算法引擎更新,並且給甲方部署,所以遇到了一些問題,通過思考和排查以及靈光一閃終於解決了。

自己寫的自動部署程序運行過程中沒有問題,因爲之前我已經在本地的4臺虛擬機上部署成功,可能當時有些地方是便嘗試邊修改所以沒有一次性成功這樣的案例,由於測試不完整,最後在甲方遠程部署的過程中出現了一些問題,這裏簡單記錄一下,留作備份。


一、在運行Mapreduce程序的過程中一直報錯:child error


hadoop分佈式環境中在每個節點都有各自的Logs,這裏是hadoop mapreduce內部的一些運行日誌輸出(namenode,secondarynamenode, jobtracker,tasktracker,datanode),都是通過org.apche.common.logging這個包裏面的LOG輸出的,路徑在${HADOOP_HOME}/logs下面;  另外除了hadoop自身的這些角色輸出日誌之外,hadoop通過心跳包通信和分發任務後,tasktracker會啓動一個單獨的進程去執行,其實內部是通過java組織了一條shell命令,設置了env,然後去執行。因此,這些Child進程的輸出並不會出現在${HADOOP_HOME}/logs中,它們在哪兒呢?其實在每個節點的hadoop.tmp.dir()目錄下面有個mapred目錄,裏面又有個userlogs目錄,這裏嗎包含了四個文件:log.index(沒有管),stdout,stderr,syslog。stdout和stderr就是child進程最開始會執行一些腳本,配置一些環境變量。因此如果這些shell腳本出了問題,輸出會在stdout和stderr,而syslog是進入jar包之後通過Log的輸出。

在child error這個問題上,因爲和子進程相關,因此查看userlogs目錄下的相關文件,在stderr中發現了出錯的詳細信息,execvp:Permission denied,然後google或者百度一下,就會發現問題所在了。這裏列出我找到的兩個鏈接

http://stackoverflow.com/questions/8344572/hadoop-tasks-execvp-permission-denied

http://blog.sina.com.cn/s/blog_69174f4701017osy.html

原因是hadoop spawn child process的時候使用的是${JAVA_HOME}/jre/bin/java而不是${JAVA_HOME}/bin/java


二、一直在hadoop logs中出現transfer blk failed


這個問題太難排查了,因爲在stdout,stderr和syslog中不會有error信息,而logs裏面又只有很抽象的transfer blk failed異常,其實這時候我們應該想到這應該是hadoop系統環境出了問題,而不是我們的mapreduce程序的問題。

最後解決這個問題是靈光一閃,通過瀏覽器訪問hadoop 的web 接口,namenode:50030 jobtracker_ip:/50070發現,live node減少了一個,並且jobtracker status上馬顯示最近執行失敗的Job的原因是因爲可能是容量不足,一般是因爲歷史job過多導致的userlogs目錄增長太快導致的,因此一般需要一段時間備份和清理userlogs目錄。找出下線的node,清空其userlogs目錄即可。


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