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 仓库。



idea社区版没有Spring Boot Helper_idea debug调试


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 的编译插件,具体步骤如下:



idea社区版没有Spring Boot Helper_idea debug调试_02


step1

右键点击,选择创建一个编译的 configuration。



idea社区版没有Spring Boot Helper_idea debug调试_03


step2

点击运行



idea社区版没有Spring Boot Helper_idea debug调试_04


steps

如果遇到如下异常,请更改 maven 的版本为 3.5.0



idea社区版没有Spring Boot Helper_idea debug调试_05


error

经过漫长的依赖下载和编译,成功后的截图如下:



idea社区版没有Spring Boot Helper_idea debug调试_06


success

编译成功后,就可以尝试运行 HBase 的源码了。

5. 在 IDEA 中运行 HBase 集群

5.1 运行 HMaster 进程

把源码所在文件夹下的 conf 目录复制到 hbase-server 目录下。

把新拷贝的 conf 目录加到 hbase-server 模块的 classpath 中,【右键 conf】->【Mark Directory as】->选择【Resource Root】


idea社区版没有Spring Boot Helper_idea debug调试_07


resource

配置面板新增 Application,application 命名为 HMaster,配置 HMaster 启动参数如下:


idea社区版没有Spring Boot Helper_idea debug调试_08


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
  1. 选择 hbase-server 模块

备注:

第三处需要配置一些 JVM 参数,指定日志的 Appender

启动(run)或者调试(debug)HMaster。



idea社区版没有Spring Boot Helper_idea debug调试_09


run

调试运行的时候可能遇到如下错误:



idea社区版没有Spring Boot Helper_idea debug调试_10


error1

这个异常在上篇博客中有提及到,需要用 jamon 插件把 hbase-server 的 jamon 目录下的模板文件处理成 java 文件。



idea社区版没有Spring Boot Helper_idea debug调试_11


jamon

jamon 具体的使用请参考上篇文章,此处不过多赘述。生成好 Java 代码后,上图中的红线异常就会消失。



idea社区版没有Spring Boot Helper_idea debug调试_12


jamon2

继续编译,可能还会遇见如下异常。



idea社区版没有Spring Boot Helper_idea debug调试_13


version-error

这个错误是 version 不匹配的错误,直接在 hbase-default.xml 文件中做如下修改。



idea社区版没有Spring Boot Helper_idea debug调试_14


version

在此处加入具体的版本号。

继续点击 run 和 debug 按钮,不出意外的话,HMaster 进程就会顺利启动,其中控制台可能会输出如下异常,但不影响最终的使用。



idea社区版没有Spring Boot Helper_idea debug调试_15


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 之后。



idea社区版没有Spring Boot Helper_idea debug调试_16


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 启动参数如下:



idea社区版没有Spring Boot Helper_idea debug调试_17


hbase shell

  1. hbae shell
  2. org.jruby.Main
  3. -Dhbase.ruby.sources=/Users/mac/other_project/apache/hbase/hbase-2.1.0/hbase-shell/src/main/ruby/
  4. -X+O /Users/mac/other_project/apache/hbase/hbase-2.1.0/bin/hirb.rb
  5. 添加 hbase-shell 模块

启动 hbase shell



idea社区版没有Spring Boot Helper_idea debug调试_18


hbase-shell

在 console 中查看启动日志,并运行一些 shell 命令,如图:



idea社区版没有Spring Boot Helper_idea debug调试_19


run-hbase-shell

mvn 编译时,请默认工程勾选的 profile,不要随意勾选其他 profile,默认的 profile 截图如下:



idea社区版没有Spring Boot Helper_idea debug调试_20


maven-profile

6. 总结

至此,HBase 源码的编译和 DEBUG 调试方案已经比较完整了,在此基础上,可以很方便地阅读 HBase 的源码和运行一些测试 demo,也可以对 HBase 进行二次开发,增加一些功能,修复一些 BUG,并重新打包和上线运行。

7. 参考链接