错误的主要特征代码是这样的:

    java.lang.Throwable: Child Error at org.apache.hadoop.mapred.TaskRunner.run(TaskRunner.java:271) Caused by: java.io.IOException: Task process exit with nonzero status of 1.

   注意返回的exitcode是1,网上还有返回其他的,比如-1,比如255等等,这里不涉及。

   第一次出现这个错误是在用pig执行其语句的时候(我们知道pig的语句都是由框架自动生成了mapreduce程序来实现的)。另外一次是使用sqoop向hive中导入数据时(也是基于mapreduce实现的)。当时就这个错误代码“1”查了很多资料。国内的国外的,大部分都说是tasktracker的日志文件夹太多,达到Linux操作的系统的ext3磁盘类型的上限了。但是无论我怎么按照其建议清空磁盘,都没有用,错误依旧。

   经过了查看出错的源码和文档。后来终于发现,我这里的这个错误的原因,其实是个很小很蠢的错误。原来是因为,我们的Hadoop执行mapreduce时,实际上调用了jdk的命令。但是其比较特别的是,他调用的不是JAVA_HOME/bin中的命令。而是JAVA_HOME/jre/bin中的命令。

   去到目标文件夹下一看,果然,不出所料。这些命令全部没有执行权限。分分钟chmod 744 ./* 。。

   再使用那些基于mapreduce的组件和框架,完美运行。

   总结:看日志要学会深入的看,只看Hadoop:50030页面的简单错误描述是比较坑爹的。另外就是看日志要搞清楚哪些是重点,有些废话,很多不同的错误都会出现相同的那么一句。如果拿到网上去查,就绕弯路了。