HBase二次開發(fā)之搭建HBase調(diào)試環(huán)境,如何遠程debug HBase源代碼
版本
HDP:3.0.1.0
HBase:2.0.0
一、前言
之前的文章也提到過,最近工作中需要對HBase進行二次開發(fā)(參照HBase的AES加密方法,為HBase增加SMS4數(shù)據(jù)加密類型)。研究了兩天,終于將開發(fā)流程想清楚并搭建好了debug環(huán)境,所以就迫不及待地想寫篇文章分享給大家。
二、思路
首先看到這個需求,肯定是需要先實現(xiàn)HBase配置AES加密《HBase配置AES加密》,或者還可以再繼續(xù)了解實現(xiàn)SMS4加密算法《Java版SMS4加密解密算法》。等到這些都完成之后,就需要想辦法實現(xiàn)HBase的SMS4數(shù)據(jù)加密了。這里我們要養(yǎng)成一種思路,那就是看官網(wǎng)。根據(jù)參考官網(wǎng),只得到如下信息:

需要實現(xiàn)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包里面發(fā)現(xiàn)了這個類。
接著就想,怎么才能二次開發(fā)這個jar包呢?于是先使用Java Decompiler工具(文末有獲取方式),反編譯該jar包,看了看AES加密模塊的代碼,發(fā)現(xiàn)必須要debug相關(guān)代碼,了解其流程,這樣才會對我之后的二次開發(fā)有幫助。
現(xiàn)在就遇到了兩個問題:
- 如何二次開發(fā)這個jar包,哪怕是一行LOG輸出也行
- 如何遠程debug HBase源代碼
中間曾嘗試過使用Java Decompiler工具反編譯得到j(luò)ar包的java文件,發(fā)現(xiàn)自己真是too young too simple,反編譯出來的工程編譯失敗,發(fā)現(xiàn)需要依賴父工程。感覺就是要編譯整個HBase源碼。
可是,我上哪去找對應(yīng)的HDP版本的HBase源碼呢?
三、獲取hdp各組件源代碼的小竅門
之所以叫小竅門,是真的找不到對應(yīng) HDP 版本的 HBase 源碼啊,hortonworks 官網(wǎng)上也沒有啊。然后就各種上網(wǎng)查資料唄,終于功夫不負有心人讓我查到了,那就是 hortonworks 的 github。下面說一下步驟。
打開瀏覽器,訪問https://github.com/hortonworks,點擊右上角的搜索框,在當前 organization 內(nèi)搜索你想要的 hdp 組件的源碼即可。
就拿如何獲取對應(yīng)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
這樣就將對應(yīng) 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 源碼的根目錄,執(zhí)行編譯命令:
mvn package -DskipTests assembly:single
編譯成功后,如下圖所示:

進入 hbase-assembly/target/ 目錄,會發(fā)現(xiàn)生成了 tar.gz 包,解壓以后,就是 hbase 的可運行源碼了,與使用 Ambari 安裝的 HBase 源碼一致:

解壓該 tar 包,看看具體內(nèi)容,如下圖所示:

hbase 的各模塊編譯后會生成 jar 包放入 lib 目錄下,當然里面也有我要的 hbase-common-2.0.0.3.0.1.0-187.jar文件。
五、遠程debug HBase源代碼
1. 配置HBase
如何二次開發(fā) hbase-common-2.0.0.3.0.1.0-187.jar 已經(jīng)解決了。那么如何遠程 debug HBase 源碼呢?首先需要分析 debug HBase 哪個組件的源代碼?之前配置好 HBase AES 加密后,我是在 hbase shell里面對HBase表的列族進行加密設(shè)置的,所以我需要操作 hbase shell 來觸發(fā) HBase 的 AES 模塊。
想著如果 HBase Master 掛了的話,HBase shell 也是不可用的狀態(tài),所以就先試試 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 端口沒有被占用,添加后如下圖所示:

如果要調(diào)試其它組件的話,我猜測也是這種方法。
為防止 debug 時間過長導(dǎo)致的 hbase master 服務(wù)停止,需要修改 hbase-site.xml 文件:
<property>
<name>zookeeper.session.timeout</name>
<value>900000</value>
</property>
原值設(shè)置超時為90秒,現(xiàn)在改為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的網(wǎng)絡(luò)驅(qū)動器,然后再通過idea打開。這樣就實現(xiàn)了使用本地的idea打開linux上的代碼了。修改idea上的代碼,其實就是修改的linux上的代碼。具體Samba配置可參考我寫的博客:Samba安裝配置。
3. 配置IDEA
遠程服務(wù)以 DEBUG 模式成功啟動后,IDEA 連接上對應(yīng)的 DEBUG 端口,就能打斷點調(diào)試了(請確保服務(wù)端代碼和本地代碼一致),Run -> Edit Configurations,具體配置如下圖所示:

添加一個新配置,選擇 Remote,如下圖所示:

配置遠程服務(wù)地址和端口:

在相關(guān)代碼上打上斷點,啟動調(diào)試,如下圖所示:

出現(xiàn)Connected to字樣,證明debug模式已開啟。執(zhí)行HBase shell,創(chuàng)建一個AES加密類型的表:
create 'hbase_1102', {NAME=>'cf1', ENCRYPTION => 'AES'}, {NAME=>'cf2'}
會觸發(fā)斷點,這時候就可以debug代碼了,看看代碼邏輯等。如下圖所示:

六、總結(jié)
本篇文章篇幅較長,但都是滿滿的干貨,將這兩天的成果記錄在這,也希望能夠幫助到大家。主要解決了
- 如何二次開發(fā)這個jar包,哪怕是一行LOG輸出也行
- 如何遠程debug HBase源代碼
如果面對未知的東西,主要還是敢于嘗試吧,萬一成功了呢 ~
環(huán)境什么的都準備好了,接下來,就要對HBase源代碼進行研究了。想想去年debug Ambari Server源碼的時候,感覺和現(xiàn)在差不多的樣子,想想就酸爽,祝我自己成功吧~
有想要 Java Decompiler 反編譯工具的朋友,可掃描下方二維碼回復(fù) 0425 關(guān)鍵字獲取。
點關(guān)注,不迷路
好了各位,以上就是這篇文章的全部內(nèi)容了,能看到這里的人呀,都是 人才。
白嫖不好,創(chuàng)作不易。 各位的支持和認可,就是我創(chuàng)作的最大動力,我們下篇文章見!
如果本篇博客有任何錯誤,請批評指教,不勝感激 !

浙公網(wǎng)安備 33010602011771號