我们知道Hive经过一些转换后,提交job到hadoop,一般我们只能debug到submitJob这里,而不知道后面那些mapper到底是怎样执行的。如果想要跟踪一下像SelectOperator是怎么处理的怎样做呢?
解决方法
使用local模式运行
确保配置hive-site.xml中mapred.job.tracker设为local
<property>
<name>mapred.job.tracker</name>
<value>local</value>
</property>
在hadoop的mapred-site.xml也有mapred.job.tracker配置,我这里也设为了local(不确定是否可以不设置)
如果设为local,系统会调用命令的方式运行
//MapRedTask.java
public int execute(DriverContext driverContext) {
//....
// Run ExecDriver in another JVM
executor = Runtime.getRuntime().exec(cmdLine, env, new File(workDir));
//....
}
上面的代码会最终调用这样的命令
/home/fatkun/hadoop/bin/hadoop jar /home/fatkun/local/hive-0.7.1-cdh3u4/lib/hive-exec-0.7.1-cdh3u4.jar org.apache.hadoop.hive.ql.exec.ExecDriver -plan file:/tmp/fatkun/hive_2012-10-21_19-55-58_644_8079645408059698793/-local-10002/plan.xml -jobconf ...
如果这里提示找不到null/bin/hadoop,是环境变量HADOOP_HOME读取不到的原因,在eclipse的debug environment加上一个HADOOP_HOME配置。(这里有图)
远程 debug hadoop
其实貌似不像远程debug,都是在本地进行的,我们知道上面是通过hadoop jar运行的。拷贝%HADOOP_HOME%/bin/hadoop一个备份出来,然后修改这个文件。
# 找到jar这一行
elif [ "$COMMAND" = "jar" ] ; then
CLASS=org.apache.hadoop.util.RunJar
# 加上下面这一行代码用于调试,6666是端口
HADOOP_OPTS="$HADOOP_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,address=6666,server=y,suspend=y"
HADOOP_OPTS="$HADOOP_OPTS $HADOOP_CLIENT_OPTS"
这样,每次调用hadoop jar这个命令时,就会等着eclipse调试了。
eclipse在Debug configuration配置一个Remote Java Application,端口填6666就可以开始调试了。
hadoop调试的更多信息点击这里
这样就可以在ExecMapper.java下断点调试了。
远程 debug hadoop 2
- 以debug模式启动Cli,${HIVE_HOME}/bin/hive –debug。进程会监听在8000端口等待调试连接。如果想更改监听端口,可以修改配置文件:${HIVE_HOME}bin/ext/debug.sh 。
- 在Eclipse中, 选择Debug configurations->Remote Java Application,填好Host和Port,确定。
- 如果Hadoop是0.23以上版本,debug模式启动Cli会报错:ERROR: Cannot load this JVM TI agent twice, check your java command line for duplicate jdwp options.。打开${Hadoop_HOME}/bin/hadoop,注释掉HADOOP_OPTS=”$HADOOP_OPTS $HADOOP_CLIENT_OPTS”即可。 注1:https://issues.apache.org/jira/browse/HIVE-2500 http://long-xie.iteye.com/blog/1779072 在yarn中单步调试时使用local job SET mapred.job.tracker=local; SET hive.exec.mode.local.auto=true; SET fs.defaultFS=file:///;