1 问题描述
在Map阶段错误日志为:
Error: java.lang.RuntimeException: PipeMapRed.waitOutputThreads(): subprocess failed with code 1 at
org.apache.hadoop.streaming.PipeMapRed.waitOutputThreads(PipeMapRed.java:322) at
org.apache.hadoop.streaming.PipeMapRed.mapRedFinished(PipeMapRed.java:537) at
org.apache.hadoop.streaming.PipeMapper.close(PipeMapper.java:132) at
org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:75) at
org.apache.hadoop.streaming.PipeMapRunner.run(PipeMapRunner.java:34) at
org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:459) at
org.apache.hadoop.mapred.MapTask.run(MapTask.java:345) at
org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:170) at
java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:415) at
org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1657) at
org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:164)
2 问题原因及解决
解决此类原因主是 Streaming 程序退出异常,序要依靠错误日志来查看详细原因,下面给出部分错误码
2.1 subprocess failed with code 1
原因定位:
map或reduce返回
1
,MapReduce
框架会将应用程序的返回值收集,subprocess failed with code 1表示程序返回的就是1。详细出错原因需结合Task Logs和程序源码定位。
2.2 subprocess failed with code 126
原因定位:
一般是由于map/reduce中调用的程序无可执行权限导致
2.3 subprocess failed with code 127
原因定位:
一般是由于map/reduce脚本未上传导致,请使用-file 上传map/reduce程序
2.4 subprocess failed with code 137
原因定位:
map或reduce程序超出平台内存限制被limit杀掉,一般的平台都会有一个默认内存限制,例如配置内存限制为800MB(137-128=9, 对应信号为SIGKILL)发生这种情况后一般登录到这台计算节点上看dmesg都能看到类似: killer: killing process….提示 ps:在新的haoop版本中,如果单个程序运行占用cpu的时间超过12小时,也会被kill返回137.
2.5 subprocess failed with code 139
原因定位:
代码有问题,进行本地数据测试
2.6 subprocess failed with code 141
原因定位:
map或reduce异常退出,平台继续向管道推送数据,因管道异常出错(141-128=13, 信号13代表着SIGPIPE错误,即管道错误)根本原因还是程序异常退出导致。详细出错原因需结合Task Logs和程序源码定位。
2.7 subprocess failed with code 255
原因定位:
map或reduce异常退出返回值-1,详细出错原因需结合Task Logs和程序源码定位
2.8 其他返回值
公式:
错误码-128 = linux返回码
//比如 返回错误码是 137, 那么它对应的linux返回码就是 9
然后查看linux kill -l
信号含义,对应检查程序