通过分析hadoop 1.0.1代码,发现map/reduce task在执行的时候,hadoop系统会先把要执行的java 命令已经一些环境变量写到一个本地的sh文件taskjvm.sh中,然后使用bash -c file的方式执行这个sh脚本,如果出错当然后抛出异常,进而导致看到
Caused by: java.io.IOException: Task process exit with nonzero status of 126.
at org.apache.hadoop.mapred.TaskRunner.run(TaskRunner.java:258)
这样的错误
所以,这个exitcode实际就是bash执行时的推出代码,bash的exitcode是有特殊含义的,通过google可以知道126表明是permission的问题,具体为啥是这样的,不是很清楚了~~
上面的那个文件在创建的是权限是700(rwx——), 而这个文件在执行的过程中又被以setsid的方式exec,会不会这中间有些permission上的问题那~~~ 源码里说了,这样做是为了防止special character attacks
好吧水平有限,看不出来这里有什么竞争条件导致出现那样的错误
bash的退出码含义可以在下面的地方查到 http://tldp.org/LDP/abs/html/exitcodes.html
这个问题可以修改hadoop源码DefaultTaskControl加入重试机制,或者对task启用reuse=-1得到缓解(reuse和非reuse执行逻辑不一样),因为涉及到文件系统,不太容易根治。