1. 前言
之前写过一篇 HBase 源码调试相关的文章,是基于社区版的 HBase1.2.0。但是,按照之前记录的方法来进行 HBase2.x 源码编译调试的时候,却总是遇见一些莫名其妙的错误。直至这两天看到一篇大神写的博客,并加以自己的实践,最终,成功在 IDEA 中编译并调试通过了社区版的 HBase2.1.0 的源码。至此,HBase1.x 和 HBase2.x 的源码编译和在 IDEA 中 DEBUG 的方案便更加完整了。
借鉴的博客地址会放在文末的参考链接中,本文会取其长处,同时也会记录一些它没有涉及到的问题。
2. 源码获取
本文编译源码使用到的 HBase 版本是社区版的 HBase2.1.0,其中,源码的获取不是通过 gihub,而是直接在其官网上下载的源码包。
http://archive.apache.org/dist/hbase/2.1.0/
3. 编译环境
- jdk 1.8
- Apache Maven 3.5.0 (之前使用的 maven 版本是 3.6.3,发现会遇到一个 findbugs-maven-plugins:3.0.0 的编译异常,网上推荐的解决方案是降低 maven 版本)
- Mac OS (Windows 系统下有些命令会有些差异)
- idea
4. 开始编译
4.1 maven 相关的配置
解压源码,直接用 IDEA 打开源码所在的文件夹,然后在 IDEA 中配置 maven 仓库。
![04c0ff9bb1c7bf1a56bbb538f35fbc6e.png](https://i-blog.csdnimg.cn/blog_migrate/d12a1165b7e48ebdfbb2c4e7bfee7e6f.jpeg)
编译项目时需要下载大量依赖,所以可以在 maven 的 conf/setting.xml 文件中配置一些镜像来加速下载。
<mirrors>
<mirror>
<id>aliyunid>
<mirrorOf>*,!clouderamirrorOf>
<name>Nexus Release Repositoryname>
<url>http://maven.aliyun.com/nexus/content/groups/publicurl>
mirror>
<mirror>
<id>centralid>
<name>Maven Repository Switchboardname>
<url>https://repo1.maven.org/maven2/url>
<mirrorOf>centralmirrorOf>
mirror>
<mirror>
<id>maven.net.cnid>
<name>oneof the central mirrors in chinaname>
<url>http://maven.net.cn/content/groups/public/url>
<mirrorOf>centralmirrorOf>
mirror>
mirrors>
4.2 执行编译命令
如果配置了 maven 的环境变量,那就直接在项目所在目录下运行如下的编译命令:
mvn clean package -DskipTests
或者在 idea 中使用 maven 的编译插件,具体步骤如下:
![4a68c81c31bdbe9a8f85c998850d15f7.png](https://i-blog.csdnimg.cn/blog_migrate/0e39417e7cd48dc4382986df2bc253eb.jpeg)
右键点击,选择创建一个编译的 configuration。
![737ae84c6018bccff794a607706bd9f2.png](https://i-blog.csdnimg.cn/blog_migrate/41f0d8d9196646f343f35ff29685aab5.jpeg)
点击运行
![67c07da1139d3aeea6be27ffd5b9b168.png](https://i-blog.csdnimg.cn/blog_migrate/1302747fa3e68123e49e26ad3c40c40d.jpeg)
如果遇到如下异常,请更改 maven 的版本为 3.5.0
![34449c7b9905470077bca997dad2045c.png](https://i-blog.csdnimg.cn/blog_migrate/3c169249e53daa9c81cf6c82f03b6889.png)
经过漫长的依赖下载和编译,成功后的截图如下:
![737d336359169fef602e2eb2940c6c2f.png](https://i-blog.csdnimg.cn/blog_migrate/dfbd026c580749be4ed365a0a372d129.png)
编译成功后,就可以尝试运行 HBase 的源码了。
5. 在 IDEA 中运行 HBase 集群
5.1 运行 HMaster 进程
把源码所在文件夹下的 conf 目录复制到 hbase-server 目录下。
把新拷贝的 conf 目录加到 hbase-server 模块的 classpath 中,【右键 conf】->【Mark Directory as】->选择【Resource Root】
![26720978fbd90f4f3a8916b21447aed7.png](https://i-blog.csdnimg.cn/blog_migrate/f4454937eb8ffce1c47530c8218778cc.jpeg)
配置面板新增 Application,application 命名为 HMaster,配置 HMaster 启动参数如下:
![612a4be7ebd17aa2eaa779cbf154e6ce.png](https://i-blog.csdnimg.cn/blog_migrate/ff06b61103729dd027942a777ad99ead.png)
图中的几处地方需要按照如下的方式配置,只是涉及到项目所在的路径需要换成自己实际的项目路径。
HMaster
org.apache.hadoop.hbase.master.HMaster
-Dproc_master -XX:OnOutOfMemoryError="kill -9 %p" -XX:+UseConcMarkSweepGC -Dhbase.log.dir=/Users/mac/other_project/apache/hbase/hbase-2.1.0/logs -Dhbase.log.file=hbase-root-master.log -Dhbase.home.dir=/Users/mac/other_project/apache/hbase/hbase-2.1.0/bin/. -Dhbase.id.str=root -Dhbase.root.logger=INFO,console,DRFA
start
选择 hbase-server 模块
备注:
第三处需要配置一些 JVM 参数,指定日志的 Appender
启动(run)或者调试(debug)HMaster。
![014faf5a26330ed7caeaf2a98c076208.png](https://i-blog.csdnimg.cn/blog_migrate/acbbdcb2a95ec0ca61f79de0137d860c.jpeg)
调试运行的时候可能遇到如下错误:
![d3c8f857b15c237fe30976f5dec42596.png](https://i-blog.csdnimg.cn/blog_migrate/10512f7d0bf645f35f65a14a9ff48abc.png)
这个异常在上篇博客中有提及到,需要用 jamon 插件把 hbase-server 的 jamon 目录下的模板文件处理成 java 文件。
![22addd3edaa55e3ee8fcaef99f297743.png](https://i-blog.csdnimg.cn/blog_migrate/984bf7fe40d6e37d0044070997788a5e.png)
jamon 具体的使用请参考上篇文章,此处不过多赘述。生成好 Java 代码后,上图中的红线异常就会消失。
![037a780268d8d263000afe29af2f81b6.png](https://i-blog.csdnimg.cn/blog_migrate/25ce5ee060385ee29fcb0f4b117cd079.png)
继续编译,可能还会遇见如下异常。
![18ab8169bf01cecb300d95a4957d52fe.png](https://i-blog.csdnimg.cn/blog_migrate/c209db1bdbd2cf9d033daf09a3503c05.png)
这个错误是 version 不匹配的错误,直接在 hbase-default.xml 文件中做如下修改。
![f4c2c937ccf7995a266356f44d8d6287.png](https://i-blog.csdnimg.cn/blog_migrate/a6db4a5c76ab549911a1c86913de21d8.png)
在此处加入具体的版本号。
继续点击 run 和 debug 按钮,不出意外的话,HMaster 进程就会顺利启动,其中控制台可能会输出如下异常,但不影响最终的使用。
![75e6e40494e6a55933266877823eba2f.png](https://i-blog.csdnimg.cn/blog_migrate/2e9d6d91db9f0a0a4b5c4b3c55927d88.png)
如果想自定义 hbase 和 zookeeper 的数据输出目录,则需要在 hbase-server 的 conf 目录中编辑 hbase-site.xml 来加入如下配置:
<configuration>
<property>
<name>hbase.rootdirname>
<value>file:///Users/mac/other_project/apache/hbase/hbase-2.1.0/data/hbase-datavalue>
property>
<property>
<name>hbase.zookeeper.property.dataDirname>
<value>/Users/mac/other_project/apache/hbase/hbase-2.1.0/data/zookeeper-datavalue>
property>
configuration>
重启 HMaster Application 之后。
![640321b6442fb5ad6bac07740580682d.png](https://i-blog.csdnimg.cn/blog_migrate/cff23aa5e4dd99165aa0920993fc911e.jpeg)
5.2 IntelliJ IDEA 中运行 hbase shell
把 conf 目录拷贝到 hbase-shell 目录下,把新拷贝的 conf 目录加到 hbase-shell 模块的 classpath 中,【右键 conf】->【Mark Directory as】->选择【Resource Root】
配置面板新增 Application,application 命名 hbase shell,配置 hbase shell 启动参数如下:
![535b69ce8da712a12a9297eeb6282a8d.png](https://i-blog.csdnimg.cn/blog_migrate/c86f56a4483aa289b27801c3f0f6d527.jpeg)
- hbae shell
- org.jruby.Main
- -Dhbase.ruby.sources=/Users/mac/other_project/apache/hbase/hbase-2.1.0/hbase-shell/src/main/ruby/
- -X+O /Users/mac/other_project/apache/hbase/hbase-2.1.0/bin/hirb.rb
- 添加 hbase-shell 模块
启动 hbase shell
![241f5e520cac497cc63d7be4589d3bdf.png](https://i-blog.csdnimg.cn/blog_migrate/26ec805c571b3a40c2445ad6439d359d.jpeg)
在 console 中查看启动日志,并运行一些 shell 命令,如图:
![9204078c383aabcd0b6d0e8bb163bd47.png](https://i-blog.csdnimg.cn/blog_migrate/0838976e9106ea8a9ac1a84537047c46.jpeg)
mvn 编译时,请默认工程勾选的 profile,不要随意勾选其他 profile,默认的 profile 截图如下:
![b7fea2c2463bc4b4728be00ddf8b3268.png](https://i-blog.csdnimg.cn/blog_migrate/9d404dca4019164a4888bb1eda56adf8.png)
6. 总结
至此,HBase 源码的编译和 DEBUG 调试方案已经比较完整了,在此基础上,可以很方便地阅读 HBase 的源码和运行一些测试 demo,也可以对 HBase 进行二次开发,增加一些功能,修复一些 BUG,并重新打包和上线运行。
7. 参考链接
- https://bbs.huaweicloud.com/blogs/180565
- HBASE 源码导入 IDEA 并开启 DEBUG 调试