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/
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 仓库。
maven
编译项目时需要下载大量依赖,所以可以在 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>
<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
mvn clean package -DskipTests
或者在 idea 中使用 maven 的编译插件,具体步骤如下:
step1
右键点击,选择创建一个编译的 configuration。
step2
点击运行
steps
如果遇到如下异常,请更改 maven 的版本为 3.5.0
error
经过漫长的依赖下载和编译,成功后的截图如下:
success
编译成功后,就可以尝试运行 HBase 的源码了。
5. 在 IDEA 中运行 HBase 集群
5.1 运行 HMaster 进程
把源码所在文件夹下的 conf 目录复制到 hbase-server 目录下。
把新拷贝的 conf 目录加到 hbase-server 模块的 classpath 中,【右键 conf】->【Mark Directory as】->选择【Resource Root】
resource
配置面板新增 Application,application 命名为 HMaster,配置 HMaster 启动参数如下:
HMaster
图中的几处地方需要按照如下的方式配置,只是涉及到项目所在的路径需要换成自己实际的项目路径。
1. HMaster
2. org.apache.hadoop.hbase.master.HMaster
3. -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
4. start
- 选择 hbase-server 模块
备注:
第三处需要配置一些 JVM 参数,指定日志的 Appender
启动(run)或者调试(debug)HMaster。
run
调试运行的时候可能遇到如下错误:
error1
这个异常在上篇博客中有提及到,需要用 jamon 插件把 hbase-server 的 jamon 目录下的模板文件处理成 java 文件。
jamon
jamon 具体的使用请参考上篇文章,此处不过多赘述。生成好 Java 代码后,上图中的红线异常就会消失。
jamon2
继续编译,可能还会遇见如下异常。
version-error
这个错误是 version 不匹配的错误,直接在 hbase-default.xml 文件中做如下修改。
version
在此处加入具体的版本号。
继续点击 run 和 debug 按钮,不出意外的话,HMaster 进程就会顺利启动,其中控制台可能会输出如下异常,但不影响最终的使用。
ignore
如果想自定义 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>
<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 之后。
data
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 启动参数如下:
hbase shell
- 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
hbase-shell
在 console 中查看启动日志,并运行一些 shell 命令,如图:
run-hbase-shell
mvn 编译时,请默认工程勾选的 profile,不要随意勾选其他 profile,默认的 profile 截图如下:
maven-profile
6. 总结
至此,HBase 源码的编译和 DEBUG 调试方案已经比较完整了,在此基础上,可以很方便地阅读 HBase 的源码和运行一些测试 demo,也可以对 HBase 进行二次开发,增加一些功能,修复一些 BUG,并重新打包和上线运行。
7. 参考链接
- https://bbs.huaweicloud.com/blogs/180565
- HBASE 源码导入 IDEA 并开启 DEBUG 调试