版本HDP:3.0.1.0html
HBase:2.0.0java
以前的文章也提到過,最近工做中須要對HBase進行二次開發(參照HBase的AES加密方法,爲HBase增長SMS4數據加密類型)。研究了兩天,終於將開發流程想清楚並搭建好了debug環境,因此就火燒眉毛地想寫篇文章分享給你們。linux
<!--more-->git
首先看到這個需求,確定是須要先實現HBase配置AES加密《HBase配置AES加密》,或者還能夠再繼續瞭解實現SMS4加密算法《Java版SMS4加密解密算法》。等到這些都完成以後,就須要想辦法實現HBase的SMS4數據加密了。這裏咱們要養成一種思路,那就是看官網。根據參考官網,只獲得以下信息:github
須要實現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相關代碼,瞭解其流程,這樣纔會對我以後的二次開發有幫助。shell
如今就遇到了兩個問題:apache
中間曾嘗試過使用Java Decompiler
工具反編譯獲得jar包的java文件,發現本身真是too young too simple
,反編譯出來的工程編譯失敗,發現須要依賴父工程。感受就是要編譯整個HBase源碼。vim
但是,我上哪去找對應的HDP版本的HBase源碼呢?segmentfault
之因此叫小竅門,是真的找不到對應 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
文件。
如何二次開發 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
我是將HBase源代碼下載到Linux上,進行編譯。而後使用Samba工具,將linux上的指定目錄映射到Windows的網絡驅動器,而後再經過idea打開。這樣就實現了使用本地的idea打開linux上的代碼了。修改idea上的代碼,其實就是修改的linux上的代碼。具體Samba配置可參考我寫的博客:Samba安裝配置。
遠程服務以 DEBUG
模式成功啓動後,IDEA
鏈接上對應的 DEBUG
端口,就能打斷點調試了(請確保服務端代碼和本地代碼一致),Run -> Edit Configurations,具體配置以下圖所示:
添加一個新配置,選擇 Remote
,以下圖所示:
配置遠程服務地址和端口:
在相關代碼上打上斷點,啓動調試,以下圖所示:
出現Connected to
字樣,證實debug
模式已開啓。執行HBase shell
,建立一個AES
加密類型的表:
create 'hbase_1102', {NAME=>'cf1', ENCRYPTION => 'AES'}, {NAME=>'cf2'}
會觸發斷點,這時候就能夠debug
代碼了,看看代碼邏輯等。以下圖所示:
本篇文章篇幅較長,但都是滿滿的乾貨,將這兩天的成果記錄在這,也但願可以幫助到你們。主要解決了
若是面對未知的東西,主要仍是勇於嘗試吧,萬一成功了呢 ~
環境什麼的都準備好了,接下來,就要對HBase源代碼進行研究了。想一想去年debug Ambari Server源碼的時候,感受和如今差很少的樣子,想一想就酸爽,祝我本身成功吧~
有想要 Java Decompiler
反編譯工具的朋友,可掃描下方二維碼回覆 0425
關鍵字獲取。
好了各位,以上就是這篇文章的所有內容了,能看到這裏的人呀,都是 人才。
白嫖很差,創做不易。 各位的支持和承認,就是我創做的最大動力,咱們下篇文章見!
若是本篇博客有任何錯誤,請批評指教,不勝感激 !