hadoop源码调试跟踪方法

标签: hadoop 源码 调试 | 发表时间:2014-11-02 23:59 | 作者:andilyliao
出处:http://www.iteye.com
最近经常有问我hadoop源码怎么看的问题,做以下讲解希望有用(hdfs调试为例)
1.在eclipse中建立java工程,然后把hadoop的src包中的内容拷贝到src资源下(仅org的即可)
2.导入hadoop中lib目录下的jar直到代码不再报错
3.搭建一个hadoop的集群,我的测试环境是1个nn和3的dn
4.修改hadoop-env.sh,我们以nn的调试为例:
hadoop-env.sh中找到
export HADOOP_NAMENODE_OPTS="-Dcom.sun.management.jmxremote $HADOOP_NAMENODE_OPTS"

然后注释掉
#export HADOOP_NAMENODE_OPTS="-Dcom.sun.management.jmxremote $HADOOP_NAMENODE_OPTS"

重新发布这个变量:
export HADOOP_NAMENODE_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=8080,server=y,suspend=y"

其中:
-Xdebug 设置为调试启动
-Xrunjdwp 调试方式,后面的都是该方式的参数:
transport=dt_socket:表示断点通过socket传输(远程打断点)
address=8000:调试用的服务端口,远程被调试的那个nn就是服务
server=y 表示是被调试的服务,如果是n表示调试者
suspend=y 表示是否等待链接调试

搞好上面的步骤后,在eclipse中找到NameNode.java类,该类在org.apache.hadoop.hdfs.server.namenode中
在这个里面找到main,然后在main中加上断点,然后右键debug configuration:
配置链接那个标签页:
ip和端口你懂的
启动你的hadoop集群,然后debug方式启动你的代码,就可以调试了。
顺便说下,hbase等都差不多,这个调试技术叫做JPDA,hbase调试就修改hbase-env.sh,地方和hadoop差不多,你肯定能找到。
hive本人没搞过远程调试,我一直觉得这个东西就是个高级的客户端,至于hadoop1的mapreduce和hadoop2的yarn非常讨厌,这个我是看了别人的博客才了解到的,此处也分享下吧
hadoop1的mapreduce在hadoop-site.xml中配置:
<property> 
    <name>mapred.child.java.opts</name> 
    <value>-Xmx1024m -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8081</value> 
</property>

并且要限制map和reduce个数为1个,否则会有问题:
<property>
    <name>mapred.tasktracker.map.tasks.maximum</name>
    <value>1</value>
</property>
<property>
    <name>mapred.tasktracker.reduce.tasks.maximum</name>
    <value>1</value>
</property>

问题我当时没有遇到,因为我的测试用的虚拟环境烂的要死,所以我提前就这么配置的,呵呵
yarn的配置在bin/yarn中
找到:
case "${COMMAND}" in
  application|applicationattempt|container)
    CLASS=org.apache.hadoop.yarn.client.cli.ApplicationCLI
    hadoop_debug "Append YARN_CLIENT_OPTS onto YARN_OPTS"
    YARN_OPTS="${YARN_OPTS} ${YARN_CLIENT_OPTS}"
    set -- "${COMMAND}" "$@"
  ;;
  classpath)
    hadoop_finalize
    echo "${CLASSPATH}"
    exit
  ;;
  daemonlog)
    CLASS=org.apache.hadoop.log.LogLevel
    hadoop_debug "Append YARN_CLIENT_OPTS onto YARN_OPTS"
    YARN_OPTS="${YARN_OPTS} ${YARN_CLIENT_OPTS}"
  ;;
  jar)
    CLASS=org.apache.hadoop.util.RunJar
    hadoop_debug "Append YARN_CLIENT_OPTS onto YARN_OPTS"
    YARN_OPTS="${YARN_OPTS} ${YARN_CLIENT_OPTS}"
  ;;
  historyserver)
    daemon="true"
    echo "DEPRECATED: Use of this command to start the timeline server is deprecated." 1>&2
    echo "Instead use the timelineserver command for it." 1>&2
    echo "Starting the History Server anyway..." 1>&2
    CLASS='org.apache.hadoop.yarn.server.applicationhistoryservice.ApplicationHistoryServer'
  ;;
  logs)
    CLASS=org.apache.hadoop.yarn.client.cli.LogsCLI
    hadoop_debug "Append YARN_CLIENT_OPTS onto YARN_OPTS"
    YARN_OPTS="${YARN_OPTS} ${YARN_CLIENT_OPTS}"
  ;;
  node)
    CLASS=org.apache.hadoop.yarn.client.cli.NodeCLI
    hadoop_debug "Append YARN_CLIENT_OPTS onto YARN_OPTS"
    YARN_OPTS="${YARN_OPTS} ${YARN_CLIENT_OPTS}"
  ;;
  nodemanager)
    daemon="true"
    CLASS='org.apache.hadoop.yarn.server.nodemanager.NodeManager'
    hadoop_debug "Append YARN_NODEMANAGER_OPTS onto YARN_OPTS"
    YARN_OPTS="${YARN_OPTS} ${YARN_NODEMANAGER_OPTS}"
    if [[ -n "${YARN_NODEMANAGER_HEAPSIZE}" ]]; then
      JAVA_HEAP_MAX="-Xmx${YARN_NODEMANAGER_HEAPSIZE}m"
    fi
  ;;
  proxyserver)
    daemon="true"
    CLASS='org.apache.hadoop.yarn.server.webproxy.WebAppProxyServer'
    hadoop_debug "Append YARN_PROXYSERVER_OPTS onto YARN_OPTS"
    YARN_OPTS="${YARN_OPTS} ${YARN_PROXYSERVER_OPTS}"
    if [[ -n "${YARN_PROXYSERVER_HEAPSIZE}" ]]; then
      JAVA_HEAP_MAX="-Xmx${YARN_PROXYSERVER_HEAPSIZE}m"
    fi
  ;;
  resourcemanager)
    daemon="true"
    CLASS='org.apache.hadoop.yarn.server.resourcemanager.ResourceManager'
    YARN_OPTS="${YARN_OPTS} ${YARN_RESOURCEMANAGER_OPTS}"
    hadoop_debug "Append YARN_RESOURCEMANAGER_OPTS onto YARN_OPTS"
    if [[ -n "${YARN_RESOURCEMANAGER_HEAPSIZE}" ]]; then
      JAVA_HEAP_MAX="-Xmx${YARN_RESOURCEMANAGER_HEAPSIZE}m"
    fi
  ;;
  rmadmin)
    CLASS='org.apache.hadoop.yarn.client.cli.RMAdminCLI'
    hadoop_debug "Append YARN_CLIENT_OPTS onto YARN_OPTS"
    YARN_OPTS="${YARN_OPTS} ${YARN_CLIENT_OPTS}"
  ;;
  timelineserver)
    daemon="true"
    CLASS='org.apache.hadoop.yarn.server.applicationhistoryservice.ApplicationHistoryServer'
    hadoop_debug "Append YARN_TIMELINESERVER_OPTS onto YARN_OPTS"
    YARN_OPTS="${YARN_OPTS} ${YARN_TIMELINESERVER_OPTS}"
    if [[ -n "${YARN_TIMELINESERVER_HEAPSIZE}" ]]; then
      JAVA_HEAP_MAX="-Xmx${YARN_TIMELINESERVER_HEAPSIZE}m"
    fi
  ;;
  sharedcachemanager)
    daemon="true"
    CLASS='org.apache.hadoop.yarn.server.sharedcachemanager.SharedCacheManager'
    YARN_OPTS="$YARN_OPTS $YARN_SHAREDCACHEMANAGER_OPTS"
  ;;
  version)
    CLASS=org.apache.hadoop.util.VersionInfo
    hadoop_debug "Append YARN_CLIENT_OPTS onto YARN_OPTS"
    YARN_OPTS="${YARN_OPTS} ${YARN_CLIENT_OPTS}"
  ;;
  *)
    CLASS="${COMMAND}"
    if ! hadoop_validate_classname "${CLASS}"; then
      hadoop_exit_with_usage 1
    fi
  ;;
esac

调试那个就在那个的最后加入调试的那个配置,以rm举例:
YARN_RESOURCEMANAGER_OPTS="$YARN_RESOURCEMANAGER_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=22222"

这个端口的目的是肯定不会重复的,因为谁会用这么2的端口呀,呵呵

已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [hadoop 源码 调试] 推荐:

hadoop源码调试跟踪方法

- - 开源软件 - ITeye博客
最近经常有问我hadoop源码怎么看的问题,做以下讲解希望有用(hdfs调试为例). 1.在eclipse中建立java工程,然后把hadoop的src包中的内容拷贝到src资源下(仅org的即可). 2.导入hadoop中lib目录下的jar直到代码不再报错. 3.搭建一个hadoop的集群,我的测试环境是1个nn和3的dn.

Hadoop学习笔记之在Eclipse中远程调试Hadoop

- - BlogJava-首页技术区
话说Hadoop 1.0.2/src/contrib/eclipse-plugin只有插件的源代码,这里给出一个我打包好的对应的Eclipse插件:. 下载后扔到eclipse/dropins目录下即可,当然eclipse/plugins也是可以的,前者更为轻便,推荐;重启Eclipse,即可在透视图(Perspective)中看到Map/Reduce.

hadoop2.2.0 源码远程调试

- - 数据库 - ITeye博客
学习hadoop2.2.0,远程调试hadoop源码. note: 只在linux上面调试,windows下面会有脚本执行的问题,可能需要安装cygwin可以解决.. 1 把编译好的hadoop源代码导入eclipse. 2 如果要调试hdfs,修改~/hadoop-2.2.0/bin/hdfs.   监听设置在这个位置,suspend=y,就是说操作dfs命令时候会挂起在6666端口,进程会暂停,直到有客户端来连接这个端口,比如eclipse远程调试.

nginx源码分析--GDB调试

- - CSDN博客架构设计推荐文章
利用gdb[i]调试nginx[ii]和利用gdb调试其它程序没有两样,不过nginx可以是daemon程序,也可以以多进程运行,因此利用gdb调试和平常会有些许不一样. 当然,我们可以选择将nginx设置为非daemon模式并以单进程运行,而这需做如下设置即可:. master_process off; 这是第一种情况:.

分布式系统Hadoop源码阅读与分析(一):作业调度器实现机制

- otter - 博客园-首页原创精华区
上一篇博文对Hadoop的作业调度器进行了介绍,我们知道,JobTracker和TaskTracker是Hadoop作业调度过程中最核心的两个部分,前者负责map/reduce作业的调度与分派,后者负责map/reduce作业的实际执行,它们之间通过RPC机制进行通讯. 下面将对Hadoop 0.20.2版本中作业调度相关源码进行分析,至于JobTracker和TaskTracker中与作业调度无关的源码部分,并未进行详细介绍.

Hadoop Streaming 编程

- - 学着站在巨人的肩膀上
Hadoop Streaming是Hadoop提供的一个编程工具,它允许用户使用任何可执行文件或者脚本文件作为Mapper和Reducer,例如:. 采用shell脚本语言中的一些命令作为mapper和reducer(cat作为mapper,wc作为reducer). 本文安排如下,第二节介绍Hadoop Streaming的原理,第三节介绍Hadoop Streaming的使用方法,第四节介绍Hadoop Streaming的程序编写方法,在这一节中,用C++、C、shell脚本 和python实现了WordCount作业,第五节总结了常见的问题.

Hadoop使用(一)

- Pei - 博客园-首页原创精华区
Hadoop使用主/从(Master/Slave)架构,主要角色有NameNode,DataNode,secondary NameNode,JobTracker,TaskTracker组成. 其中NameNode,secondary NameNode,JobTracker运行在Master节点上,DataNode和TaskTracker运行在Slave节点上.

Hadoop MapReduce技巧

- - 简单文本
我在使用Hadoop编写MapReduce程序时,遇到了一些问题,通过在Google上查询资料,并结合自己对Hadoop的理解,逐一解决了这些问题. Hadoop对MapReduce中Key与Value的类型是有要求的,简单说来,这些类型必须支持Hadoop的序列化. 为了提高序列化的性能,Hadoop还为Java中常见的基本类型提供了相应地支持序列化的类型,如IntWritable,LongWritable,并为String类型提供了Text类型.

Hadoop TaskScheduler浅析

- - kouu&#39;s home
TaskScheduler,顾名思义,就是MapReduce中的任务调度器. 在MapReduce中,JobTracker接收JobClient提交的Job,将它们按InputFormat的划分以及其他相关配置,生成若干个Map和Reduce任务. 然后,当一个TaskTracker通过心跳告知JobTracker自己还有空闲的任务Slot时,JobTracker就会向其分派任务.

HADOOP安装

- - OracleDBA Blog---三少个人自留地
最近有时间看看hadoop的一些东西,而且在测试的环境上做了一些搭建的工作. 首先,安装前需要做一些准备工作. 使用一台pcserver作为测试服务器,同时使用Oracle VM VirtualBox来作为虚拟机的服务器. 新建了三个虚拟机以后,安装linux,我安装的linux的版本是redhat linux 5.4 x64版本.