天天看點

HBase Thrift 使用以及Thriftserver 分析

對于thriftserver 我們主要從2個大的方面進行分析:thrift的使用;thriftserver的部署;thriftserver的啟動,初始化;thriftserver的讀寫等請求處理;

一:thrift的使用

thrift的主要目的是友善各個語言可以使用hbase,java,c++,py,php,等等;在我們下載下傳下來的hbase的檔案裡面的下面的目錄:

你會看到2個檔案夾,分别是:

1>.首先要在自己的機器上面部署安裝thrift軟體;注意,服務端的thrift編譯環境和client需要一樣。我們雲hbase的thrift的版本是0.9.0,是以希望你們編譯的thrift版本也是0.9.0,這樣以後進行互動才沒有問題;具體的安裝可以參考thrift連結,也可以用别的方案,比如我是直接是用brew的指令行。

2>.thrift -gen php hbase.thrift 會對應的在本地目錄下生産gen-py的對應的一個檔案夾,如果是生産别的語言的話,使用别的指令,具體指令參考thrift連結,當然這上面也有介紹thrift的安裝。

我們需要的是gen-php的檔案夾,當然,也可以生産c++,py,java等等;

3>.實際上在hbase.thrift的檔案裡面已經有告訴我們怎麼使用這些函數以及資料結構,不如我最簡單的現在需要進行get操作;使用的是php語言的話,那麼thrift文檔裡面有下面的介紹;

上述的東西我們看到了,get方法,你需要人為的輸入table的name,row key,column 的name,以及你需要的些屬性,解釋的意思就是,get 一個單獨的cell,一列的資料;當然,如果你需要别的東西的話,那是另外的節後會有的;

4>.需要擷取得到thrift相關的依賴的庫,比如,transport,factory,protocol等等,這個在thrift的最原始的包裡面會有的,但是還是要提醒下,一定要明确client 和服務端的thrift版本要一緻,不然會出問題;

二:thriftserver的部署

上述文章中沒有對如果部署thriftserver進行步驟性介紹,這裡介紹下,首先你下載下傳了hbase-bin的二進制包以後,你需要在本地搭建thriftservr的話,需要做3件事情:1.配置conf檔案,conf檔案夾下的的hbase-site.xml檔案裡面需要配置下遠端的zk位址(遠端的hbase需要開啟本地的白名單);2.配置本地的thriftserver的堆記憶體,這個基于你的操作屬性進行設定,如果你的scan單次會涉及很多的資料,建議設定大等,不過一般都設定個128m就ok了,(ecs如果是記憶體足夠);3.到bin目錄下,執行sh hbase-daemon.sh start thrift 當然,這裡啟動哪個版本的thrift也是基于上面文章的介紹以及個人選擇進行的。然後就可以使用了。

四:thriftserver的初始化啟動

最初的話,我們從最基本的啟動接口 開始入手看如何啟動thriftserver,我們的啟動指令是sh hbas-deamon.sh start thrift/thrif2,啟動對應的thriftserver,我們可以進入最終啟動的bin目錄下的hbase的可執行檔案進行檢視,基于輸入的不同thrit 還是thrift2,啟動的是org.apache.hadoop.hbase.thrift.thriftserver,org.apache.hadoop.hbase.thrift2.thriftserver的這個class 檔案,這裡我們以簡單的org.apache.hadoop.hbase.thrift.thriftserver進行對應的源碼分析,分析啟動的時候做的操作,進入hbase的源碼,以thriftserver的main方法進入:

以此為入口調到thriftserverrunner内部的run方法,在這個函數内部我們會看到thriftserver的初始化建立本地的server,包括設定使用與thrift的服務端相關資訊包括:tprotocolfactory,tprocessor,ttransportfactory等等基本資訊初始化完成,此外我們比較關心的就是這個thriftserver的server的初始化,這主要是基于不同的impltype去建立,這裡預設使用的是thread_pool 的方式的,我們以預設的方式往下看:

上述的代碼,可以看到的就是,擷取得到綁定ip,預設是'0.0.0.0',以及基于得到的端口(預設9090),設定的逾時時間,設定好對應的tservertransport,設定好相應的threadpoolserver的參數,然後設定好對應的初始化的server;這裡實際上這段代碼以及對于thriftserver需要的ip port ,傳輸的thrift協定都設定好了(threadpoolserve内部也有對應的初始化的線程池),然後serve()方法内部會啟動對應的端口綁定以及初始化的線程池的操作,開始接受client的請求,可以了解的thriftserver的服務模型是,單線程的接收用戶端的請求,接收到請求,丢給後端的線程池進行操作;

上面大概介紹了預設的情況下,hbase的thriftserver的啟動初始化,的相關操作,大概理順了一個流程,細節裡面的,各個操作的配置哪裡去取這些細小的地方,沒有描述;

三:thriftserver的調用

前段是thrift的處理,大概是從processer的process方法開始往下查,主要是從hbasehandler進行觀測,比如get請求,落到這裡是get操作,我們看下面的代碼:

這裡往下看的話,實際上就和正常的java api的rpc請求一緻了。其他的操作也是類似的。