HBase二次开发之搭建HBase调试环境,如何远程debug HBase源代码
版本
HDP:3.0.1.0
HBase:2.0.0
一、前言
之前的文章也提到过,最近工作中需要对HBase进行二次开发(参照HBase的AES加密方法,为HBase增加SMS4数据加密类型)。研究了两天,终于将开发流程想清楚并搭建好了debug环境,所以就迫不及待地想写篇文章分享给大家。
二、思路
首先看到这个需求,肯定是需要先实现HBase配置AES加密《HBase配置AES加密》,或者还可以再继续了解实现SMS4加密算法《Java版SMS4加密解密算法》。等到这些都完成之后,就需要想办法实现HBase的SMS4数据加密了。这里我们要养成一种思路,那就是看官网。根据参考官网,只得到如下信息:

需要实现org.apache.hadoop.hbase.io.crypto.CipherProvider类,所以先要搞清楚这个类在哪个jar包里面。最后,在/usr/hdp/3.0.1.0-187/hbase/lib/目录下的hbase-common-2.0.0.3.0.1.0-187.jar包里面发现了这个类。
接着就想,怎么才能二次开发这个jar包呢?于是先使用Java Decompiler工具(文末有获取方式),反编译该jar包,看了看AES加密模块的代码,发现必须要debug相关代码,了解其流程,这样才会对我之后的二次开发有帮助。
现在就遇到了两个问题:
- 如何二次开发这个jar包,哪怕是一行LOG输出也行
- 如何远程debug HBase源代码
中间曾尝试过使用Java Decompiler工具反编译得到jar包的java文件,发现自己真是too young too simple,反编译出来的工程编译失败,发现需要依赖父工程。感觉就是要编译整个HBase源码。
可是,我上哪去找对应的HDP版本的HBase源码呢?
三、获取hdp各组件源代码的小窍门
之所以叫小窍门,是真的找不到对应 HDP 版本的 HBase 源码啊,hortonworks 官网上也没有啊。然后就各种上网查资料呗,终于功夫不负有心人让我查到了,那就是 hortonworks 的 github。下面说一下步骤。
打开浏览器,访问https://github.com/hortonworks,点击右上角的搜索框,在当前 organization 内搜索你想要的 hdp 组件的源码即可。
就拿如何获取对应HDP版本的HBase源码为例吧:按照上述方法搜索,如下图所示:

选择 hbase-release ,如下图所示:

我用的 hdp 3.0.1.0-187 ,所以我找到

然后使用 git 工具,将源码下载。hbase 的 tag 有很多,不需要所有的都下载下来,这里我们选择下载 HDP-3.0.1.0-187-tag 的源码。命令如下所示:
git clone -b HDP-3.0.1.0-187-tag --depth 1 https://github.com/hortonworks/hbase-release.git
这样就将对应 HDP 版本的 HBase源码下载下来了,其余组件的下载也是按照此方法。
四、编译
源码下载完成后,就需要编译。因为我猜想通过Ambari安装的HBase源码目录(/usr/hdp/3.0.1.0-187/hbase/),就是HBase编译后的代码。是或者不是或者有没有差异,等试过才知道,要大胆地去尝试。
使用maven编译,为了提速,修改maven的镜像:
编辑 setting.xml 文件,vim /usr/maven/apache-maven-3.3.9/conf/settings.xml,找到<mirrors>标签,在里面添加阿里云与hortonworks的镜像,代码如下所示:
<mirror>
<id>nexus-aliyun</id>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
<mirrorOf>central</mirrorOf>
</mirror>
<mirror>
<id>hw_central</id>
<name>Hortonworks Mirror of Central</name>
<url>http://repo.hortonworks.com/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
切换到 hbase 源码的根目录,执行编译命令:
mvn package -DskipTests assembly:single
编译成功后,如下图所示:

进入 hbase-assembly/target/ 目录,会发现生成了 tar.gz 包,解压以后,就是 hbase 的可运行源码了,与使用 Ambari 安装的 HBase 源码一致:

解压该 tar 包,看看具体内容,如下图所示:

hbase 的各模块编译后会生成 jar 包放入 lib 目录下,当然里面也有我要的 hbase-common-2.0.0.3.0.1.0-187.jar文件。
五、远程debug HBase源代码
1. 配置HBase
如何二次开发 hbase-common-2.0.0.3.0.1.0-187.jar 已经解决了。那么如何远程 debug HBase 源码呢?首先需要分析 debug HBase 哪个组件的源代码?之前配置好 HBase AES 加密后,我是在 hbase shell里面对HBase表的列族进行加密设置的,所以我需要操作 hbase shell 来触发 HBase 的 AES 模块。
想着如果 HBase Master 挂了的话,HBase shell 也是不可用的状态,所以就先试试 debug HBase Master。
首先通过 Ambari 停止 HBase Master ,修改 HBase Master 所在主机的 hbase-env.conf 文件,在 export HBASE_MASTER_OPTS 处添加以下配置:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005
需要确保 5005 端口没有被占用,添加后如下图所示:

如果要调试其它组件的话,我猜测也是这种方法。
为防止 debug 时间过长导致的 hbase master 服务停止,需要修改 hbase-site.xml 文件:
<property>
<name>zookeeper.session.timeout</name>
<value>900000</value>
</property>
原值设置超时为90秒,现在改为15分钟。
修改完成之后,我们启动我们的HBase Master,注意这里不能通过Ambari来启动HBase Master了,会覆盖掉修改的配置,在命令行中使用hbase用户来启动我们的HBase Master。具体命令如下所示:
sudo -u hbase /usr/hdp/current/hbase-master/bin/hbase-daemon.sh --config /usr/hdp/current/hbase-master/conf start master
启动完成之后,建议实时查看日志的输出:
tail -f /var/log/hbase/hbase-hbase-master-xxx.log
2. 映射Linux代码到windows本地
我是将HBase源代码下载到Linux上,进行编译。然后使用Samba工具,将linux上的指定目录映射到Windows的网络驱动器,然后再通过idea打开。这样就实现了使用本地的idea打开linux上的代码了。修改idea上的代码,其实就是修改的linux上的代码。具体Samba配置可参考我写的博客:Samba安装配置。
3. 配置IDEA
远程服务以 DEBUG 模式成功启动后,IDEA 连接上对应的 DEBUG 端口,就能打断点调试了(请确保服务端代码和本地代码一致),Run -> Edit Configurations,具体配置如下图所示:

添加一个新配置,选择 Remote,如下图所示:

配置远程服务地址和端口:

在相关代码上打上断点,启动调试,如下图所示:

出现Connected to字样,证明debug模式已开启。执行HBase shell,创建一个AES加密类型的表:
create 'hbase_1102', {NAME=>'cf1', ENCRYPTION => 'AES'}, {NAME=>'cf2'}
会触发断点,这时候就可以debug代码了,看看代码逻辑等。如下图所示:

六、总结
本篇文章篇幅较长,但都是满满的干货,将这两天的成果记录在这,也希望能够帮助到大家。主要解决了
- 如何二次开发这个jar包,哪怕是一行LOG输出也行
- 如何远程debug HBase源代码
如果面对未知的东西,主要还是敢于尝试吧,万一成功了呢 ~
环境什么的都准备好了,接下来,就要对HBase源代码进行研究了。想想去年debug Ambari Server源码的时候,感觉和现在差不多的样子,想想就酸爽,祝我自己成功吧~
有想要 Java Decompiler 反编译工具的朋友,可扫描下方二维码回复 0425 关键字获取。
点关注,不迷路
好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是 人才。
白嫖不好,创作不易。 各位的支持和认可,就是我创作的最大动力,我们下篇文章见!
如果本篇博客有任何错误,请批评指教,不胜感激 !

HBase二次开发之搭建HBase调试环境,如何远程debug HBase源代码的更多相关文章
- Redis源码漂流记(二)-搭建Redis调试环境
Redis源码漂流记(二)-搭建Redis调试环境 一.目标 搭建Redis调试环境 简要理解Redis命令运转流程 二.前提 1.有一些c知识简单基础(变量命名.常用数据类型.指针等) 可以参考这篇 ...
- 用Intellij idea搭建solr调试环境
最近在使用solr时,配置会有一些问题,log里面打印出日志了,但是还是不知道发生这样错误的原因.于是想学习一下相关的solr源码,以下是如何搭建solr调试环境步骤. solr调试环境搭建,首先下载 ...
- OSGI企业应用开发(二)Eclipse中搭建Felix运行环境
上篇文章介绍了什么是OSGI以及使用OSGI构建应用的优点,接着介绍了两款常用的OSGI实现,分别为Apache Felix和Equinox,接下来开始介绍如何在Eclipse中使用Apache Fe ...
- 使用Sublime Text搭建python调试环境
原文地址:http://blog.csdn.net/wenxuansoft/article/details/38559731 pycharmt等IDE虽然用着爽,但毕竟在速度.资源上还是比较让人不爽的 ...
- win10下正确使用Sublime Text搭建python调试环境
pycharmt等IDE虽然用着爽,但毕竟在速度.资源上还是比较让人不爽的. 使用IDE无非是图个方便省事,特别是像我这种有些记性差的来说. IDE说起来方便于的几个地方就是: 1.语法颜色高亮 ...
- 使用Sublime Text搭建python调试环境[转]
pycharmt等IDE虽然用着爽,但毕竟在速度.资源上还是比较让人不爽的. 使用IDE无非是图个方便省事,特别是像我这种有些记性差的来说. IDE说起来方便于的几个地方就是: 1.语法颜色高亮 2. ...
- HBase 二次开发 java api和demo
1. 试用thrift python/java以及hbase client api.结论例如以下: 1.1 thrift的安装和公布繁琐.可能会遇到未知的错误,且hbase.thrift的版本 ...
- saiku3.8二次开发项目搭建(非maven)
参考文章:http://blog.csdn.net/gsying1474/article/details/51603535 本文大部分参考了上面的博文,这里只是做一个记录,由于本人maven能力有限, ...
- 用Qemu模拟vexpress-a9 (二) --- 搭建u-boot调试环境
参考: http://blog.csdn.net/caspiansea/article/details/12986565 环境介绍 Win7 64 + Vmware 11 + ubuntu14.04 ...
随机推荐
- HDU 6444 Neko's loop(单调队列)
Neko has a loop of size nn. The loop has a happy value aiai on the i−th(0≤i≤n−1)i−th(0≤i≤n−1) grid. ...
- 【36.11%】【codeforces 725C】Hidden Word
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- windows添加右键菜单
哔哔 有时候想要用websotrm打开一个项目, 有时候想要用VScode打开,最快的方法就是右键指定打开方式了 这些软件安装的时候会自带,但如果有些软件没有自带右键项,就得去注册表里手动添加 这些东 ...
- 转:EBS-自动获取/创建CCID
DECLARE l_ccid NUMBER; l_msg ); l_chart_of_account_id NUMBER; l_set_of_book_id NUMBER; BEGIN l_set_o ...
- c++ CArray函数
CArray属于MFC,是一个数组模板类.MFC的数组类支持的数组类似于常规数组,可以存放任何数据类型.常规数组在使用前必须将其定义成能够容纳所有可能需要的元素,即先确定大小,而MFC数组类创建的对象 ...
- F#周报2019年第51&52期
新闻 介绍DataFrame 介绍System.Threading.Channels ConfigureAwait常见问题 第三次年度C#降临节 .NET会议--2020年1月14日 如何找到F#的工 ...
- dWebpack编译速度优化实战
当你的应用的规模还很小时,你可能不会在乎Webpack的编译速度,无论使用3.X还是4.X版本,它都足够快,或者说至少没让你等得不耐烦.但随着业务的增多,嗖嗖嗖一下项目就有上百个组件了,也是件很简单的 ...
- The fifth day of Crawler learning
使用mongoDB 下载地址:https://www.mongodb.com/dr/fastdl.mongodb.org/win32/mongodb-win32-x86_64-2008plus-ssl ...
- nginx部署VUE跨域访问api
H5端配置跨域 nginx跨域配置 server { listen 80; charset utf-8; server_name you_dome_name;#location /tasklist.j ...
- [工具] Git版本管理(三)(工作流)
一.冲突解决 Beyond Compare软件 下载BCompare软件,并安装. 删除安装目录下的BCUnrar.dll文件. 使用码: w4G-in5u3SH75RoB3VZIX8htiZgw4E ...