每一个成功人士的背后,必定曾经做出过勇敢而又孤独的决定。
放弃不难,但坚持很酷~
版本 HDP:3.0.1.0 HBase:2.0.0
一、前言
之前的文章也提到过,最近工作中需要对HBase进行二次开发(参照HBase的AES加密方法,为HBase增加SMS4数据加密类型)。研究了两天,终于将开发流程想清楚并搭建好了debug环境,所以就迫不及待地想写篇文章分享给大家。
二、思路
首先看到这个需求,肯定是需要先实现HBase配置AES加密《HBase配置AES加密》,或者还可以再继续了解实现SMS4加密算法《Java版SMS4加密解密算法》。等到这些都完成之后,就需要想办法实现HBase的SMS4数据加密了。这里我们要养成一种思路,那就是看官网。根据参考官网
http://hbase.apache.org/book.html#hbase.encryption.server
只得到如下信息:
需要实现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。具体命令如下所示:
代码语言:javascript复制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配置可参考我写的博客:
https://841809077.github.io/2017/12/11/Samba安装配置.html
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源码的时候,感觉和现在差不多的样子,想想就酸爽,祝我自己成功吧~