使用eclipse调试hive mapreduce

我们知道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

  1. 以debug模式启动Cli,${HIVE_HOME}/bin/hive –debug。进程会监听在8000端口等待调试连接。如果想更改监听端口,可以修改配置文件:${HIVE_HOME}bin/ext/debug.sh 。

  2. 在Eclipse中, 选择Debug configurations->Remote Java Application,填好Host和Port,确定。
  3. 如果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:///; 
updatedupdated2024-08-302024-08-30