版本

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 官网上也没有啊。然后就各种上网查资料呗,终于功夫不负有心人让我查到了,那就是 hortonworksgithub。下面说一下步骤。

打开浏览器,访问https://github.com/hortonworks,点击右上角的搜索框,在当前 organization 内搜索你想要的 hdp 组件的源码即可。

就拿如何获取对应HDP版本的HBase源码为例吧:按照上述方法搜索,如下图所示:

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

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

然后使用 git 工具,将源码下载。hbasetag 有很多,不需要所有的都下载下来,这里我们选择下载 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 来触发 HBaseAES 模块。

想着如果 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源代码的更多相关文章

  1. Redis源码漂流记(二)-搭建Redis调试环境

    Redis源码漂流记(二)-搭建Redis调试环境 一.目标 搭建Redis调试环境 简要理解Redis命令运转流程 二.前提 1.有一些c知识简单基础(变量命名.常用数据类型.指针等) 可以参考这篇 ...

  2. 用Intellij idea搭建solr调试环境

    最近在使用solr时,配置会有一些问题,log里面打印出日志了,但是还是不知道发生这样错误的原因.于是想学习一下相关的solr源码,以下是如何搭建solr调试环境步骤. solr调试环境搭建,首先下载 ...

  3. OSGI企业应用开发(二)Eclipse中搭建Felix运行环境

    上篇文章介绍了什么是OSGI以及使用OSGI构建应用的优点,接着介绍了两款常用的OSGI实现,分别为Apache Felix和Equinox,接下来开始介绍如何在Eclipse中使用Apache Fe ...

  4. 使用Sublime Text搭建python调试环境

    原文地址:http://blog.csdn.net/wenxuansoft/article/details/38559731 pycharmt等IDE虽然用着爽,但毕竟在速度.资源上还是比较让人不爽的 ...

  5. win10下正确使用Sublime Text搭建python调试环境

      pycharmt等IDE虽然用着爽,但毕竟在速度.资源上还是比较让人不爽的. 使用IDE无非是图个方便省事,特别是像我这种有些记性差的来说. IDE说起来方便于的几个地方就是: 1.语法颜色高亮 ...

  6. 使用Sublime Text搭建python调试环境[转]

    pycharmt等IDE虽然用着爽,但毕竟在速度.资源上还是比较让人不爽的. 使用IDE无非是图个方便省事,特别是像我这种有些记性差的来说. IDE说起来方便于的几个地方就是: 1.语法颜色高亮 2. ...

  7. HBase 二次开发 java api和demo

    1. 试用thrift python/java以及hbase client api.结论例如以下:     1.1 thrift的安装和公布繁琐.可能会遇到未知的错误,且hbase.thrift的版本 ...

  8. saiku3.8二次开发项目搭建(非maven)

    参考文章:http://blog.csdn.net/gsying1474/article/details/51603535 本文大部分参考了上面的博文,这里只是做一个记录,由于本人maven能力有限, ...

  9. 用Qemu模拟vexpress-a9 (二) --- 搭建u-boot调试环境

    参考: http://blog.csdn.net/caspiansea/article/details/12986565 环境介绍 Win7 64 + Vmware 11 + ubuntu14.04 ...

随机推荐

  1. 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.  ...

  2. 【36.11%】【codeforces 725C】Hidden Word

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  3. windows添加右键菜单

    哔哔 有时候想要用websotrm打开一个项目, 有时候想要用VScode打开,最快的方法就是右键指定打开方式了 这些软件安装的时候会自带,但如果有些软件没有自带右键项,就得去注册表里手动添加 这些东 ...

  4. 转:EBS-自动获取/创建CCID

    DECLARE l_ccid NUMBER; l_msg ); l_chart_of_account_id NUMBER; l_set_of_book_id NUMBER; BEGIN l_set_o ...

  5. c++ CArray函数

    CArray属于MFC,是一个数组模板类.MFC的数组类支持的数组类似于常规数组,可以存放任何数据类型.常规数组在使用前必须将其定义成能够容纳所有可能需要的元素,即先确定大小,而MFC数组类创建的对象 ...

  6. F#周报2019年第51&52期

    新闻 介绍DataFrame 介绍System.Threading.Channels ConfigureAwait常见问题 第三次年度C#降临节 .NET会议--2020年1月14日 如何找到F#的工 ...

  7. dWebpack编译速度优化实战

    当你的应用的规模还很小时,你可能不会在乎Webpack的编译速度,无论使用3.X还是4.X版本,它都足够快,或者说至少没让你等得不耐烦.但随着业务的增多,嗖嗖嗖一下项目就有上百个组件了,也是件很简单的 ...

  8. The fifth day of Crawler learning

    使用mongoDB 下载地址:https://www.mongodb.com/dr/fastdl.mongodb.org/win32/mongodb-win32-x86_64-2008plus-ssl ...

  9. nginx部署VUE跨域访问api

    H5端配置跨域 nginx跨域配置 server { listen 80; charset utf-8; server_name you_dome_name;#location /tasklist.j ...

  10. [工具] Git版本管理(三)(工作流)

    一.冲突解决 Beyond Compare软件 下载BCompare软件,并安装. 删除安装目录下的BCUnrar.dll文件. 使用码: w4G-in5u3SH75RoB3VZIX8htiZgw4E ...