使用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下断点调试了。


转自http://fatkun.com/2012/10/debug-hive-mapreduce-with-eclipse.html

你可能感兴趣的:(debug,hive)