在一个项目中,通过命令行提交MR,在捕获标准输出和标准错误时候发现,hadoop jar 命令提交mr正常执行,控制台打印出来的信息都被放到标准错误中了。
比如,执行wordcount,把标准错误重定向到error.log文件中:
hadoop jar hadoop-examples-0.20.2-cdh3u2.jar wordcount /tmp/lxw11/ /tmp/lxw11output 2>error.log
结果发现,MR正常执行,控制台没有打印出任何信息,而是把信息全部当成标准错误,定向到error.log文件中。
换一下,如果把标准输出重定向到error.log中,发现信息又被打印到控制台,而error.log中什么也没有。
hadoop fs -rmr /tmp/lxw11output hadoop jar hadoop-examples-0.20.2-cdh3u2.jar wordcount /tmp/lxw11/ /tmp/lxw11output 1>error.log
导致这样的原因是在$HADOOP_HOME/conf/log4j.properties 中的console配置:
log4j.appender.console.target=System.err
将此配置改成:
log4j.appender.console.target=System.out
即可解决上面的问题。
但在hive中,用hive -e “sql”命令执行sql,也存在这样的问题,改变log4j配置没解决,看了下源码,初步判断是
org.apache.hadoop.hive.ql.session.SessionState.LogHelper 中的以下方法造成的:
public PrintStream getInfoStream() { SessionState ss = SessionState.get(); return ((ss != null) && (ss.info != null)) ? ss.info : getErrStream(); }
具体还待研究。。
如果觉得本博客对您有帮助,请 赞助作者 。
转载请注明:lxw的大数据田地 » hadoop jar提交mapreduce打印出的标准输出和标准错误 stdout stderr