最近在寫mapreduce程序的時候會遇到了幾次ipeMapRed.waitOutputThreads(): subprocess failed with code X的報錯,使用python寫MapReduce程序在執(zhí)行過程中出現(xiàn)了如下報錯,幾乎全部是由python腳本的問題造成的。
下面記錄一下幾次遇到錯誤的一個原因和解決方法:
這里通過拉取MapReduce程序的執(zhí)行日志,拖取日志的命令是:yarn logs -applicationId +自己任務(wù)的id
eg:yarn logs -applicationId application_1575254959577_5382 > excuse.log
1、with code 1
出現(xiàn)with code 1 的時候大多數(shù)原因都是python腳本里某句語句出現(xiàn)問題的。
日志拉取下來以后,直接定位python腳本的錯誤位置,可以在vim命令模式下輸入 /Traceback 直接可以定位到錯誤所在位置,如下圖:

這里就可以看出是因為mapper20200409-1.py腳本中的vod_status變量為定義的原因,就可以進行修改python腳本。
ps:如果是導(dǎo)入的py模塊沒有找到的錯誤,要檢查兩個地方,一是py腳本本身有沒有寫錯,二是shell腳本上是否有上傳該py模塊
2、with code 127
出現(xiàn)這個錯誤的時候查看日志,是因為 #! /usr/bin/env python 頭部這行出現(xiàn)了錯誤,如圖

shell沒有用對應(yīng)的python解釋器去解釋腳本,而是直接用shell解釋了
為什么會出現(xiàn)這個,原因是因為在windows上寫的腳本在拉進linux,會出現(xiàn)換行符的問題,
inux下的文本文件以ascii碼為10的字符表示換行。而windows下則使用連續(xù)的13和10兩個字符。在python和c語言里使用\r代表ascii符為13的字符,叫做回車符,而\n代表ascii碼為10的字符,叫做換行符。
對于#!/usr/bin/env python\r\n
這樣一行文本,windows下的程序會認為#!/usr/bin/env python就是一行。而linux呢,則會認為#! /usr/bin/env python\r是一行。于是,剛才的錯誤就出來了,因為根本沒有python\r這個文件嘛。
有個比較奇怪的地方,仔細想想,env如果出錯的話應(yīng)該是報這樣的錯誤信息的:
/usr/bin/env: python : No such file or directory (python后面有一個回車符)
那為什么現(xiàn)在是:
: No such file or directory
這主要是因為\r這個字符的緣故。在linux終端下,輸出\r會什么都不顯示,只是把光標移到行首??纯次矣胮ython取得env輸出的出錯信息:
/usr/bin/env: python\r: No such file or directory
于是終端雖然輸出了/usr/bin/env: python,但是碰到\r后,光標會被移到行首,接著輸出了:No such file or directory把前面的覆蓋掉了。
我把py腳本直接復(fù)制再在linux上粘貼,再運行mapreduce就不出錯了。但是奇怪的是之前在Windows上直接上傳文件到linux 時候運行是沒有問題的(可能是因為之前是在linux上下載下來進行修改再上傳回去的原因嗎,思考ing)