前言:为了更深入的理解HBase的源码,对源码进行跟踪调试是一个很好的方法。本文详细记录了把社区版的HBase1.2.0源码导入idea中,进行编译调试的过程,以及在整个操作流程中遇到的一些坑。

一、我的环境

开始操作前,请确认自己的环境,避免因为软件环境的原因,产生没有记录到的问题。

  • jdk 1.8

  • Maven 3.6.1

  • Idea 2019.1.3

  • git version 2.21.1

  • HBase 1.2.0

  • Mac OS

二、下载源码

git clone https://github.com/apache/hbasegit clone https://gitee.com/mirrors/hbase.git

为了加速下载,这里我使用的是gitee的国内仓库


三、编译HBase源码

网上很多教程说需要先编译Hadoop源码才能编译HBase,但是本人亲测,如果只是在单机节点测试,即使用standalone模式是不需要事先编译Hadoop源码的。

JDK maven等工具大家请自行安装。

代码下载完成后,用IDEA直接打开,选择你需要的分支,初始化需要下载maven依赖,这个过程稍显漫长。

执行下面的命令进行编译:

mvn clean package -DskipTests=true

不出意外,编译命令是可以正常编译的。

编译成功

四、本地启动HMaster

Debug Configuration设置

为了能在单机节点上运行HBase,我们需要在conf/hbase-site.xml下设置相关数据的存储目录。即在hbase-site.xml里加入以下配置信息。

<configuration>    <property>        # 此配置用来存放HBase的数据目录,你不需要事先创建HBase目录,只用保证其父级目录存在。        # 当然,你也可以随意指定这个目录。        <name>hbase.rootdirname>        <value>file:///Users/leo_jie/Public/hbasevalue>    property>    <property>        # 此配置是为了跳过版本检查        <name>hbase.defaults.for.version.skipname>        <value>truevalue>    property>configuration>

HBase架构里有一个HMaster是负责管理整个集群的。所以我们程序的起点也就在 HMaster 这个类里面。

org.apache.hadoop.hbase.master.HMaster-Dlog4j.configuration=file:/Users/leo_jie/other_project/hbase/conf/log4j.properties# log4j.properties的目录换成你自己的

相关配置的操作如下图所示:


红框的地方是需要注意的地方。此时,如果你直接running,不出意外会报错,报错位置在hbase-server模块,大致是tmpl相关包下的类找不到。解决方法如下。

五、生成模版代码,解决tmpl相关包下的类找不到

在hbase-server的jamon包下,有以jamon为后缀名的文件,jamon是一种模板语言,可以把该文件生成java文件。你需要把这些模版文件转成java代码,下图中我已经转换过代码了。
在http://www.jamon.org网站下载jamon程序jamon-dist-2013.12.28.zip。
解压后拷贝jamon-api-2.3.1.jar jamon-processor-2.4.2.jar jamon-runtime-2.4.1.jar到源码的\hbase-server\src\main\jamon目录:


然后在该文件夹打开命令行执行以下命令处理jamon文件:

java -cp .;jamon-api-2.3.1.jar;jamon-processor-2.4.2.jar;jamon-runtime-2.4.1.jar org.jamon.compiler.TemplateProcessor --srcDir=. --destDir=. org\apache\hadoop\hbase\tmpl\regionserver\*java -cp .;jamon-api-2.3.1.jar;jamon-processor-2.4.2.jar;jamon-runtime-2.4.1.jar org.jamon.compiler.TemplateProcessor --srcDir=. --destDir=. org\apache\hadoop\hbase\tmpl\common\*java -cp .;jamon-api-2.3.1.jar;jamon-processor-2.4.2.jar;jamon-runtime-2.4.1.jar org.jamon.compiler.TemplateProcessor --srcDir=. --destDir=. org\apache\hadoop\hbase\tmpl\master\*

下图演示的是转换Java代码的示例操作:


如果你是Windows的操作系统,上述命令应该可以顺利执行,如果您是Mac用户,不出意外,你会遇到两种(可能是三种)类型的异常。一种是权限问题,一种可能是java环境变量中的CLASS_PATH没有配置,另一种是如图异常,一堆乱码。


解决方法是,在Mac系统下,上述命令的正式使用方式是:

java -cp .:jamon-api-2.3.1.jar:jamon-processor-2.4.2.jar:jamon-runtime-2.4.1.jar org.jamon.compiler.TemplateProcessor --srcDir=. --destDir=. org/apache/hadoop/hbase/tmpl/regionserver/*java -cp .:jamon-api-2.3.1.jar:jamon-processor-2.4.2.jar:jamon-runtime-2.4.1.jar org.jamon.compiler.TemplateProcessor --srcDir=. --destDir=. org/apache/hadoop/hbase/tmpl/common/*java -cp .:jamon-api-2.3.1.jar:jamon-processor-2.4.2.jar:jamon-runtime-2.4.1.jar org.jamon.compiler.TemplateProcessor --srcDir=. --destDir=. org/apache/hadoop/hbase/tmpl/master/*

分别执行成功后就可以把模版文件转成java文件了。

jamon文件会生成相应的java文件,然后将hbase-server的src/main/jmon加入src路径,就可以引用到新生成的java文件了。


六、重新编译HBase代码

mvn clean package -DskipTests=true

七、继续运行我们的HMaster Start

运行成功后,控制台不会输出异常。HBase的MasterUI也能正常打开。http://127.0.0.1:1061



八、Shell

光有master我们无法与HBase交互,所以接下来需要配置HBase shell。

org.jruby.Main-Dlog4j.configuration=file:/Users/leo_jie/other_project/hbase/conf/log4j.properties-Dhbase.ruby.sources=/Users/leo_jie/other_project/hbase/hbase-shell/src/main/ruby/Users/leo_jie/other_project/hbase/bin/hirb.rb

点击运行我们的shell。


最好在文本编辑器里写好命令后再粘贴过来,如果直接在 console 中写会出现回退bug。

九、总结

到此我们已经完成了HBase源码的编译和调试与交互,从此可以在源码的海洋里一脸懵逼的遨游了。文章会继续更新,以记录源码调试中遇到的问题。

十、参考链接

https://lihuimintu.github.io/2019/03/19/hbase-src-debug/
https://www.cnblogs.com/stillcoolme/p/10011189.html#_label2_1

hadoop源码_HBASE源码导入IDEA并开启DEBUG调试相关推荐

  1. 【收藏】HBase源码 | HBase2.x源码导入IDEA并开启DEBUG调试

    https://www.jielongping.com/archives/hbase2debug

  2. android sutdio导入源码教程,《AndroidStudio导入安卓源码-idegen》---可方便查看安卓源代码...

    idegen是Android源码中的一个模块,需要编译一下.生成一个jar包.然后再进行构建生成AndroidStudio配置相关文件. > 什么是idegen 要将Android系统源代码工程 ...

  3. 小朱笔记之hadoop应用实战、源码分析-目录

    小朱笔记之hadoop应用实战.源码分析 1.1 背景目的 该笔记从宏观架构.安装配置.源码分析.使用案例四个方面剖析了Hadoop1.0.3,希望能对同学们提供帮助,赠人玫瑰,手留余香.能够把had ...

  4. Spring源码阅读 源码环境搭建(一)

    ring 源码阅读的搭建(一) 一 下载spring源码 进入官方网页:https://spring.io/projects/spring-framework 进入相关的github位置,下载zip包 ...

  5. 个人免签码支付源码+监控APP【野马资源网】

    1.宝塔面板中新建网站安装环境需要设置:+ 运行环境为PHP7.0+MYsql5.6 网站目录->运行目录 设置为public并保存伪静态 设置为thinkphp并保存默认文档 设置将index ...

  6. Loongson2f_灵珑9S2A_debian5(lenny)更改国内archive软件源并使用源码编译安装bochs-2.6.9

    先前我写过在装有debian6的灵珑一体机上,使用源码编译安装bochs虚拟机的文章.后来,尝试在原机配套的共创系统(debian5,lenny)上,也使用源码来编译安装bochs虚拟机,经过一番折腾 ...

  7. 最新码支付源码+完整版+免挂监听回调+微信、支付宝、qq监控APP打包教程

    码支付手机APP打包教程 码支付官网:https://pay.madanbao.com 1.打开uniapp的官网注册一个账号,网址为:www.dcloud.io/ 3.打开工具导入项目,打开mani ...

  8. 【Java学习整理】2021最新版 Eclipse下载+安装+页面介绍+常见问题解答+查看源码+常用快捷键+Debug调试(详细)

    学习 Java 语言程序设计必须选择一个功能强大.使用简单,能够辅助程序设计的 IDE. Eclipse 是目前最流行的 Java 语言开发工具,它强大的代码辅助功能,可以帮助开发人员自动完成语法修正 ...

  9. 幼儿园连锁管理系统源码 此源码已测试过,可正常运行 代码测试完整,界面漂亮,多套皮肤供选择

    幼儿园连锁管理系统源码 此源码已测试过,可正常运行 代码测试完整,界面漂亮,多套皮肤供选择 支持短信提醒 功能介绍: 一,通知公告管理 二,考勤管理 考勤查询,考勤统计,考勤设置,考勤干预,考勤分组, ...

最新文章

  1. H3C学习笔记《五》(初级理论知识)
  2. 用python画漂亮图片-使用 Python/matplotlib 画出漂亮的论文插图
  3. 知识图谱 vs. 对话系统专题讨论 - PaperWeekly 社区
  4. VTK:图像映射到颜色用法实战
  5. 8086CPU跳转指令
  6. 操作篇 bgp协议了解与学习
  7. 395. Longest Substring with At Least K Repeating Characters
  8. zabbix编译安装
  9. 实现自动带密码登陆远程机执行shell命令(linux)
  10. 30,000人如何帮助挑选新的Bash徽标
  11. 使用Sakura查看字符十六进制编码(附带ASCII编码表)
  12. php 新浪ip接口,php利用新浪接口查询ip获取地理位置示例
  13. 全国各省市县统计年鉴/中国环境统计年鉴/中国工业企业数据库/中国专利数据库/污染排放数据库
  14. 电池电量检测方法-库仑计-基于LTC2941
  15. Windows软件清单
  16. 2021 第四届安洵杯 MISC wp
  17. ios 内存深度优化_iOS内存优化
  18. 全球及中国电子级无水氟化氢发展动态与未来需求趋势预测报告2021~2026年
  19. java md5加密长度_java中使用MD5加密算法进行加密
  20. 【ParaView教程】第四章 常见问题 —— 怎样计算正面投影面积?

热门文章

  1. Git学习总结(22)——Git 常用操作再总结
  2. Maven学习总结(35)——Maven项目错误 JAX-RS (REST Web Services) 2.0 can not be installed问题...
  3. Java Web学习总结(2)——Servlet入门
  4. celery java_Python的Java Celery项目相当于什么?
  5. 宏基因组多少钱一个样_离网式光伏发电系统费用一般是多少钱
  6. HDU 1286 找新朋友 (欧拉函数)
  7. 让Salesforce用户管理变得更加容易的几种最佳实践
  8. angularjs中的数据绑定
  9. java读写excel文件
  10. C++ 虚函数与多态