前言:为了更深入的理解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/hbase
git clone https://gitee.com/mirrors/hbase.git
为了加速下载,这里我使用的是gitee的国内仓库
![a73b211aafe347beb804357cc5cd2417.png](https://img-blog.csdnimg.cn/img_convert/a73b211aafe347beb804357cc5cd2417.png)
三、编译HBase源码
网上很多教程说需要先编译Hadoop源码才能编译HBase,但是本人亲测,如果只是在单机节点测试,即使用standalone模式是不需要事先编译Hadoop源码的。
JDK maven等工具大家请自行安装。
代码下载完成后,用IDEA直接打开,选择你需要的分支,初始化需要下载maven依赖,这个过程稍显漫长。
执行下面的命令进行编译:
mvn clean package -DskipTests=true
不出意外,编译命令是可以正常编译的。
![beeb40396a3d5476402b0bfdcb102b5f.png](https://img-blog.csdnimg.cn/img_convert/beeb40396a3d5476402b0bfdcb102b5f.png)
四、本地启动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的目录换成你自己的
相关配置的操作如下图所示:
![ac979042f0648a3572f2d4f27b1a31cc.png](https://img-blog.csdnimg.cn/img_convert/ac979042f0648a3572f2d4f27b1a31cc.png)
红框的地方是需要注意的地方。此时,如果你直接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目录:
![e1bf5ecd01c1804c66a2f2a67e67d646.png](https://img-blog.csdnimg.cn/img_convert/e1bf5ecd01c1804c66a2f2a67e67d646.png)
然后在该文件夹打开命令行执行以下命令处理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代码的示例操作:
![44b4509d49c9690c801822b47c773cce.png](https://img-blog.csdnimg.cn/img_convert/44b4509d49c9690c801822b47c773cce.png)
如果你是Windows的操作系统,上述命令应该可以顺利执行,如果您是Mac用户,不出意外,你会遇到两种(可能是三种)类型的异常。一种是权限问题,一种可能是java环境变量中的CLASS_PATH没有配置,另一种是如图异常,一堆乱码。
![d6f1a9594c9dd8ae76de6cd23248300f.png](https://img-blog.csdnimg.cn/img_convert/d6f1a9594c9dd8ae76de6cd23248300f.png)
解决方法是,在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文件了。
![46e3c7389bde6fbc271ca52851a026a1.png](https://img-blog.csdnimg.cn/img_convert/46e3c7389bde6fbc271ca52851a026a1.png)
六、重新编译HBase代码
mvn clean package -DskipTests=true
七、继续运行我们的HMaster Start
运行成功后,控制台不会输出异常。HBase的MasterUI也能正常打开。http://127.0.0.1:1061
![05e1a0c5d6e41c7afe722a8bed0cfc2e.png](https://img-blog.csdnimg.cn/img_convert/05e1a0c5d6e41c7afe722a8bed0cfc2e.png)
![3a118c4880f62fbc5b9020e02bd142b1.png](https://img-blog.csdnimg.cn/img_convert/3a118c4880f62fbc5b9020e02bd142b1.png)
八、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
![fc5bcde004065eb996c55d31df92d991.png](https://img-blog.csdnimg.cn/img_convert/fc5bcde004065eb996c55d31df92d991.png)
点击运行我们的shell。
![50ef6569c6a706293004a566bb9f7187.png](https://img-blog.csdnimg.cn/img_convert/50ef6569c6a706293004a566bb9f7187.png)
最好在文本编辑器里写好命令后再粘贴过来,如果直接在 console 中写会出现回退bug。
九、总结
到此我们已经完成了HBase源码的编译和调试与交互,从此可以在源码的海洋里一脸懵逼的遨游了。文章会继续更新,以记录源码调试中遇到的问题。
十、参考链接
https://lihuimintu.github.io/2019/03/19/hbase-src-debug/
https://www.cnblogs.com/stillcoolme/p/10011189.html#_label2_1