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 ...
随机推荐
- Scala中 下划线的用处
From: http://congli.iteye.com/blog/2169401 1.作为“通配符”,类似Java中的*.如import scala.math._ 2.:_*作为一个整体,告诉 ...
- Vue的数据双向绑定和Object.defineProperty()
Vue是前端三大框架之一,也被很多人指责抄袭,说他的两个核心功能,一个数据双向绑定,一个组件化分别抄袭angular的数据双向绑定和react的组件化思想,咱们今天就不谈这种大是大非,当然我也没到达那 ...
- [USACO10OCT]Lake Counting(DFS)
很水的DFS. 为什么放上来主要是为了让自己的博客有一道DFS题解,,, #include<bits/stdc++.h> using namespace std; ][],ans,flag ...
- 如何在ClickOnce 应用中使用 GitVersion
https://github.com/GitTools/GitVersion/issues/1153 I'm using GitVersion in an internal ClickOnce app ...
- 仿快播APP源码
目录 仿快播系统 一.项目总结三步走 二.项目需求分析 三.搭建框架 四.ORM框架分析 五.功能分析 六.项目开发--仿快播视频 服务端client start.py ---- 启动文件 conf ...
- 小小知识点(三十八)MPSK和MQAM调制的实现——利用IQ调制
IQ调制的原理 (一)调制基本原理 (二)调制基本原理 利用IQ调制实现MPSK(QPSK 8PSK BPSK)和MQAM(16QAM 64QAM)调制 (一)利用IQ调制实现QPSK调制 ...
- Redis-NoSQL入门和概述(一)
NoSQL简史及定义 NoSQL 这个术语最早是在 1998 年被Carlo Strozzi命名在他的轻量的,开源的关系型数据库上的,但是该数据库没有提供标准的SQL接口:在2009 年再次被Eric ...
- 6.7 Mapreduce作业流JobControl和Oozie
1.1 Mapreduce作业流JobControl和Oozie 更复杂的任务,需要多个mapreduce作业,形成作业流,而不是增加map和reduce的复杂度.复杂问题,可以用高级语言pig.h ...
- json查询结果绑定
M_Hisorder.doQuery = function (){ $("#dataList").empty(); var data = ""; var url ...
- VS从标准输入读入文件
1.点击[生成],在对应目标平台[64 or 32]文件夹下的[release]或[debug]下找到可执行文件 2.读取销售记录文件 1)打开cmd,将销售记录文件和可执行文件放在同一文件夹下 2) ...