这里补充一下:
使用eclipse调试hive mapreduce
我们知道Hive经过一些转换后,提交job到hadoop,一般我们只能debug到submitJob这里,而不知道后面那些mapper到底是怎样执行的。如果想要跟踪一下像SelectOperator是怎么处理的怎样做呢? 解决方法使用local模式运行确保配置hive-site.xml中mapred.job.tracker设为local
- <font size="3"><property>
- <name>mapred.job.tracker</name>
- <value>local</value>
- </property></font>
复制代码
在hadoop的mapred-site.xml也有mapred.job.tracker配置,我这里也设为了local(不确定是否可以不设置)
如果设为local,系统会调用命令的方式运行 - <font size="3">//MapRedTask.java
- public int execute(DriverContext driverContext) {
- //....
- // Run ExecDriver in another JVM
- executor = Runtime.getRuntime().exec(cmdLine, env, new File(workDir));
- //....
- }</font>
复制代码
上面的代码会最终调用这样的命令
- <font size="3">/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 ...
- </font>
复制代码
如果这里提示找不到null/bin/hadoop,是环境变量HADOOP_HOME读取不到的原因,在eclipse的debug environment加上一个HADOOP_HOME配置远程 debug hadoop其实貌似不像远程debug,都是在本地进行的,我们知道上面是通过hadoop jar运行的。拷贝%HADOOP_HOME%/bin/hadoop一个备份出来,然后修改这个文件。- <font size="3"># 找到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"</font>
复制代码
这样,每次调用hadoop jar这个命令时,就会等着eclipse调试了。
eclipse在Debug configuration配置一个Remote Java Application,端口填6666就可以开始调试了。
hadoop调试的更多信息点击这里
这样就可以在ExecMapper.java下断点调试了。
|