暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

HBASE源码导入IDEA并开启DEBUG调试

HBase工作笔记 2020-04-08
645

前言:为了更深入的理解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的国内仓库

三、编译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.rootdir</name>
        <value>file:///Users/leo_jie/Public/hbase</value>
    </property>
    <property>
        # 此配置是为了跳过版本检查
        <name>hbase.defaults.for.version.skip</name>
        <value>true</value>
    </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

文章转载自HBase工作笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论