`

hadoop源码调试跟踪方法

阅读更多
最近经常有问我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的端口呀,呵呵
分享到:
评论
1 楼 rashly 2017-08-07  
请问一下address=8000的8000是随便写的吗

相关推荐

    Hadoop在Windows下用IDEA调试

    Hadoop是一个开源的大数据处理框架,通常用于分布式存储和计算,而源码调试对于理解和优化Hadoop应用至关重要。 首先,我们需要确保安装了正确的环境。这包括Java Development Kit (JDK)、Apache Hadoop及其依赖库...

    hadoop源码的第三方jar包

    通过引入这些库,开发者可以更高效地调试和扩展Hadoop源代码,了解其内部机制,并创建满足特定需求的应用。在Eclipse这样的集成开发环境中,将这些jar包添加到构建路径,可以确保编译和运行时对依赖库的正确引用。...

    hadoop-2.7.6-src

    可以通过阅读源码、跟踪调试、分析日志等方式逐步深入,同时参考官方文档和社区讨论,有助于更好地理解Hadoop的工作原理。 通过深入研究Hadoop 2.7.6的源码,开发者不仅可以了解其内部工作流程,还能为优化和定制...

    Hadoop-2.2.0源码包

    这个版本的Hadoop源码包含了所有相关的Java源文件、配置文件以及构建脚本,为开发者提供了全面的视角来探索这个分布式计算平台。 Hadoop是一个开源框架,主要用于处理和存储海量数据。其核心由两个主要组件构成:...

    hadoop模块编译与日志调试.doc|hadoop模块编译与日志调试.doc

    编译Hadoop源码,可以在源码根目录下执行`mvn package -Psrc -DskipTests`命令。`-Psrc`参数指示Maven构建源代码包,`-DskipTests`则跳过单元测试,以加快编译速度。 - **模块替换**:编译完成后,每个模块会在其...

    如何在Windows下的eclipse调试Hadoop2.2.0分布式集群

    在Windows环境下,使用Eclipse进行Hadoop 2.2.0分布式集群的调试是一项重要的技能,这可以帮助开发者更好地理解和优化Hadoop程序。以下是一些关键的知识点,将指导你完成这个过程。 首先,Hadoop是一个开源的分布式...

    Hadoop权威指南英文第四版+源码 pdf非扫描版 有目录

    书中的"说明.txt"可能包含了关于如何使用和获取书中提到的资源的信息,例如下载Hadoop不同版本的链接和方法,这对于想要跟踪Hadoop最新发展或者对比不同版本的特性是非常有价值的。 "hadopp-book-master"可能是一个...

    大数据Windows下虚拟机内部Hadoop的安装使用

    首先,获取Hadoop源码,你可以从Apache官网下载最新版本。将源码解压到你希望的目录,例如 `/usr/local/src`: ```bash wget https://apache.org/dist/hadoop/common/hadoop-3.3.1/hadoop-3.3.1.tar.gz tar -xvf ...

    MapReduce Job本地提交过程源码跟踪及分析

    在这个过程中,源码跟踪能够帮助我们更好地理解每个步骤的细节,例如配置的加载、文件的读写、网络通信的实现等。通过对源码的分析,我们可以发现优化点,比如减少不必要的文件上传,提高作业提交效率。 在实际开发...

    Hadoop开发者入门专刊.pdf

    通常,开发者需要在Eclipse等集成开发环境中配置Hadoop源码,然后进行编译。在Windows和Linux环境下,安装步骤略有不同,包括设置环境变量、获取源码、构建项目以及解决依赖关系等。通过编译源码,开发者可以定制化...

    Hadoop实战源代码

    7. **监控与日志**:源码可能包含监控脚本或工具,用于跟踪任务性能,以及日志记录,帮助调试和优化程序。 8. **集群配置**:可能有示例配置文件,展示如何设置Hadoop集群,包括修改`core-site.xml`、`hdfs-site....

    hadoop 源代码归档 3

    这个归档可能包含了Hadoop的核心组件,如HDFS(Hadoop Distributed File System)和MapReduce,以及其他相关模块的源码,便于开发者研究、学习和定制。 【标签】:“Hadoop” 【知识点详解】: 1. **Hadoop框架**...

    hadoop-lzo-master.zip

    8. **监控和调试**:通过 Hadoop 的日志和监控工具(如 Ganglia 或 Ambari)可以跟踪 LZO 压缩对集群性能的影响,如 I/O 速率、CPU 使用率等。 9. **注意事项**:LZO 压缩不支持跨平台的压缩和解压缩,这意味着在...

    datax源码在线下载

    8. **日志系统**:DataX的日志系统可以帮助开发者跟踪任务执行状态,记录迁移过程中的关键信息,对于调试和优化有重要作用。 9. **性能优化**:DataX在源码层面进行了大量的性能优化,例如批量读写、缓冲池利用、...

    nutch-1.3源码

    通过深入研究 Nutch-1.3 的源码,不仅可以掌握网络爬虫的基本原理和技术,还能提升在 Java、Hadoop 和搜索引擎领域的专业技能。这对于从事大数据处理、搜索引擎开发或者网络信息挖掘的开发者来说,具有极高的学习...

    推荐系统java源码

    在Java项目中,日志记录是必不可少的,它有助于调试和监控程序的运行状态。这个DTD可能定义了项目中使用的特定日志格式。 `LICENSE`文件包含了项目的授权信息,决定了其他人可以如何使用、修改和分发源代码。对于...

    intelligentwarehousing源码.zip

    六、源码学习与调试 在深入理解源码前,需安装所有依赖库,配置开发环境,然后通过阅读主入口文件、核心模块和关键函数,逐步理解决策流程和逻辑结构。对于复杂的算法,可以借助调试工具进行逐行分析。 总结,...

    apache-mahout-trunk_java_物联_源码.zip

    源码中会包含对Hadoop输入输出格式的支持,以及如何在分布式环境中并行执行算法的实现。 5. **物联网应用**: "物联"标签可能意味着这个源码版本特别考虑了物联网(IoT)环境下的应用。在物联网场景下,Mahout可能被...

    酒店管理系统后台源码.rar.rar

    2. **房间管理**:包括房间类型设置、房间状态跟踪(如预订、入住、空闲、维修等)、房间价格策略设定等。这部分可能涉及到数据库设计,如ER模型,以及SQL查询优化。 3. **预订管理**:支持在线预订、取消、修改等...

    javamap源码-HADOOP-COUNTER-SOURCE-CODE:在HadoopMapReduce编码中使用自定义计数器的Java程序

    这不仅有助于调试和优化Hadoop作业,还能为监控系统提供有价值的数据,帮助理解数据处理的性能和行为。 总之,Hadoop的计数器是实现分布式计算任务监控的关键工具,它使开发者能够更好地理解和控制MapReduce作业的...

Global site tag (gtag.js) - Google Analytics