在eclipse远程调试mapreduce(hadoop2)

背景

线上的服务器都是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

updatedupdated2023-12-062023-12-06