背景
线上的服务器都是linux,直接在线上debug不需要准备太多测试数据。
实现
远程调试实际上实在服务端开启一个监听端口,通过eclipse连接进行debug。调试mapreduce程序需要修改配置,让mapreduce就在本机运行。从hadoop拷贝一份配置出来,修改mapper-site.xml配置(基于hadoop2配置说明)
<property>
<name>mapreduce.jobtracker.staging.root.dir</name>
<value>/tmp</value>
</property>
<property>
<name>yarn.app.mapreduce.am.staging-dir</name>
<value>/tmp</value>
</property>
<property>
<name>mapreduce.framework.name</name>
<value>local</value>
</property>
<property>
<name>mapreduce.jobtracker.address</name>
<value>local</value>
</property>
<property>
<name>mapred.job.tracker</name>
<value>local</value>
</property>
注意检查这些标签是不是都有了。。可以放到最后覆盖原来的值 在hadoop-env.sh加上,这里的address=52902是监听的端口,suspend=y表示等待我们连接才继续执行下去
export HADOOP_CLIENT_OPTS="$HADOOP_CLIENT_OPTS -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=52902"
执行hadoop程序,指定配置文件目录为我们改过的配置目录
hadoop --config ./conf jar xx.jar xxx
最后,在eclipse的debug configuration新增一个remote java application,填入IP和端口,点击debug即可。
调试NodeManager
在yarn-env.sh加入
YARN_NODEMANAGER_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8092"
调试ResouceManager
在yarn-env.sh加入
export YARN_RESOURCEMANAGER_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8091"
调试appMaster
设置只有一台nodemanager,在mapred-site.xml 加入
<property>
<name>yarn.app.mapreduce.am.command-opts</name>
<value> -Xmx512m -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=8314</value>
</property>
如果不可以,试多几次。。不知道为什么。检查一下进程有没有启动。 ps aux|grep MRAppMaster
不足
不能调试一个jar包有两个job,执行到第二个job时会报错,可能原因是HADOOP_CLIENT_OPTS被加载了两次,并且第二个job启动时需要更换端口,否则会冲突。
不是很清楚hadoop LocalJobRunner是怎样调用的,并且暂时没调试第二个job就不深究了。
远程调试hive
执行命令,会启动监听端口8000
hive --debug
如果报错,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” 在hive输入以下命令,在单机执行
SET mapred.job.tracker=local;
SET hive.exec.mode.local.auto=true;
SET fs.defaultFS=file:///;
打印日志
<span class="pln">hive </span><span class="pun">--</span><span class="pln">hiveconf hive</span><span class="pun">.</span><span class="pln">root</span><span class="pun">.</span><span class="pln">logger</span><span class="pun">=</span><span class="pln">DEBUG</span><span class="pun">,</span><span class="pln">console</span>
via: http://fatkun.com/2012/10/debug-hive-mapreduce-with-eclipse.html
参考
hadoop2.2.0 源码远程调试 这里有图
http://www.aboutyun.com/thread-6504-1-1.html