Hbase源碼分析:RPC概況


   RPC是hbase中Master,RegionServer和Client三者之間通信交流的紐帶。了解hbase的rpc機制能夠為通過源碼學習hbase奠定良好的基礎。因為了解了hbase的rpc機制能夠很快通過debug深入理解hbase各種機制(比方說flush,compaction,scan等請求)的流程。同時也便於碰到問題時,通過源碼分析找到原因,畢竟源碼面前了無秘密。

1,RPC簡介

RPC(remote procedure call)即遠程過程調用。對於本地調用,定義好一個函數以后,程序的其他部分通過調用該函數,就可以返回想要的結果。而RPC唯一的區別就是函數定義和函數調用通常位於不同的機器,因為涉及到不同的機器,所以RPC相比較本地函數調用多了通信部分。主要涉及到兩個角色調用方(client端)和函數定義實現(server端)。RPC調用的流程如下面圖所示(圖片來自鏈接)。

2,HBase中RPC概況

HBase中的RPC是RegionServer,Master以及Client(如Hbase shell, JAVA client API)三者之間通信的紐帶。RegionServer和Master作為hbase server端部分最核心的兩個component,主要是通過提供RPC調用的服務來滿足客戶端的請求。當然RegionServer和Master之間服務也通過RPC來實現。

2.1, RegionServer提供的服務

通過下面的代碼片段,可以看到RegionServer提供的RPC服務主要是ClientService和AdminService這兩個接口提供的服務。

 1   protected List<BlockingServiceAndInterface> getServices() {
 2     List<BlockingServiceAndInterface> bssi = new ArrayList<BlockingServiceAndInterface>(2);
 3     bssi.add(new BlockingServiceAndInterface(
 4       ClientService.newReflectiveBlockingService(this),
 5       ClientService.BlockingInterface.class));
 6     bssi.add(new BlockingServiceAndInterface(
 7       AdminService.newReflectiveBlockingService(this),
 8       AdminService.BlockingInterface.class));
 9     return bssi;
10   }

 其中,ClientServices接口定義如下,可以看到主要是提供數據操作的接口(Get,Mutate,scan等等)

 1 service ClientService {
 2   rpc Get(GetRequest)
 3     returns(GetResponse);
 4 
 5   rpc Mutate(MutateRequest)
 6     returns(MutateResponse);
 7 
 8   rpc Scan(ScanRequest)
 9     returns(ScanResponse);
10 
11   rpc BulkLoadHFile(BulkLoadHFileRequest)
12     returns(BulkLoadHFileResponse);
13 
14   rpc ExecService(CoprocessorServiceRequest)
15     returns(CoprocessorServiceResponse);
16     
17   rpc ExecRegionServerService(CoprocessorServiceRequest)
18     returns(CoprocessorServiceResponse);
19 
20   rpc Multi(MultiRequest)
21     returns(MultiResponse);
22 }

AdminService的服務定義如下, 可以看到主要提供hbase表管理相關的操作,region的合並,split等等。

 1 service AdminService {
 2   rpc GetRegionInfo(GetRegionInfoRequest)
 3     returns(GetRegionInfoResponse);
 4 
 5   rpc GetStoreFile(GetStoreFileRequest)
 6     returns(GetStoreFileResponse);
 7 
 8   rpc GetOnlineRegion(GetOnlineRegionRequest)
 9     returns(GetOnlineRegionResponse);
10 
11   rpc OpenRegion(OpenRegionRequest)
12     returns(OpenRegionResponse);
13 
14   rpc WarmupRegion(WarmupRegionRequest)
15     returns(WarmupRegionResponse);
16 
17   rpc CloseRegion(CloseRegionRequest)
18     returns(CloseRegionResponse);
19 
20   rpc FlushRegion(FlushRegionRequest)
21     returns(FlushRegionResponse);
22   ...52 }

2.2, Master提供的服務

通過下面的代碼片段,可以看到Master主要四個接口的服務。MasterService和RegionServerStatusService,以及super.getServices()就是ClientServices和AdminService。

 1   protected List<BlockingServiceAndInterface> getServices() {
 2     List<BlockingServiceAndInterface> bssi = new ArrayList<BlockingServiceAndInterface>(4);
 3     bssi.add(new BlockingServiceAndInterface(
 4       MasterService.newReflectiveBlockingService(this),
 5       MasterService.BlockingInterface.class));
 6     bssi.add(new BlockingServiceAndInterface(
 7       RegionServerStatusService.newReflectiveBlockingService(this),
 8       RegionServerStatusService.BlockingInterface.class));
 9     bssi.addAll(super.getServices());
10     return bssi;
11   }

MasterService的服務定義部分如下, 可以看到主要提供表DML相關的服務。

  1 service MasterService {
  2   /** Used by the client to get the number of regions that have received the updated schema */
  3   rpc GetSchemaAlterStatus(GetSchemaAlterStatusRequest)
  4     returns(GetSchemaAlterStatusResponse);
  5 
  6   /** Get list of TableDescriptors for requested tables. */
  7   rpc GetTableDescriptors(GetTableDescriptorsRequest)
  8     returns(GetTableDescriptorsResponse);
  9 
 10   /** Get the list of table names. */
 11   rpc GetTableNames(GetTableNamesRequest)
 12     returns(GetTableNamesResponse);
 13 
 14   /** Return cluster status. */
 15   rpc GetClusterStatus(GetClusterStatusRequest)
 16     returns(GetClusterStatusResponse);
 17 
 18   /** return true if master is available */
 19   rpc IsMasterRunning(IsMasterRunningRequest) returns(IsMasterRunningResponse);
 20 
 21   /** Adds a column to the specified table. */
 22   rpc AddColumn(AddColumnRequest)
 23     returns(AddColumnResponse);
 24 
 25   /** Deletes a column from the specified table. Table must be disabled. */
 26   rpc DeleteColumn(DeleteColumnRequest)
 27     returns(DeleteColumnResponse);
 28 
 29   /** Modifies an existing column on the specified table. */
 30   rpc ModifyColumn(ModifyColumnRequest)
 31     returns(ModifyColumnResponse);
 32 
 33   /** Move the region region to the destination server. */
 34   rpc MoveRegion(MoveRegionRequest)
 35     returns(MoveRegionResponse);
 36   ...236 }

而RegionServerStatusService主要是與regionserver狀態有關的接口。

 1 service RegionServerStatusService {
 2   /** Called when a region server first starts. */
 3   rpc RegionServerStartup(RegionServerStartupRequest)
 4     returns(RegionServerStartupResponse);
 5 
 6   /** Called to report the load the RegionServer is under. */
 7   rpc RegionServerReport(RegionServerReportRequest)
 8     returns(RegionServerReportResponse);
 9 
10   /**
11    * Called by a region server to report a fatal error that is causing it to
12    * abort.
13    */
14   rpc ReportRSFatalError(ReportRSFatalErrorRequest)
15     returns(ReportRSFatalErrorResponse);
16 
17   /** Called to get the sequence id of the last MemStore entry flushed to an
18    * HFile for a specified region. Used by the region server to speed up
19    * log splitting. */
20   rpc GetLastFlushedSequenceId(GetLastFlushedSequenceIdRequest)
21     returns(GetLastFlushedSequenceIdResponse);
22 
23   /**
24    * Called by a region server to report the progress of a region
25    * transition. If the request fails, the transition should
26    * be aborted.
27    */
28   rpc ReportRegionStateTransition(ReportRegionStateTransitionRequest)
29     returns(ReportRegionStateTransitionResponse);
30 }

3,HBase中RPC的總體框架

hbase中server中有關rpc的類和成員的之間的包含和繼承關系如下圖所示:

從上圖可以看到Master繼承了HRegionServer,而在HRegionServer中包含了rpcServices,具體點對於HRegionServer對應為RSRpcServices,而HMaste對應MasterRpcServices。而RSRpcServices中包含了RpcServer,這個類主要用來服務rpc。其中Listener負責監聽請求,對於獲取到的請求,交由Reader負責讀取,Resonder負責發送rpc請求結果,而RpcScheduler負責任務的調度。關於Listener,Responder,Reader和Scheduler之間的流程,稍后再詳談。

4,小結

這里主要對hbase rpc部分做了一個宏觀的認識,包括rpc介紹,rpc提供的服務以及rpc在hbase源碼中的相關類和對象的集成和包含關系。通過整理這些,對hbase的rpc有了概括性的了解。接下來會對server端和client端rpc的過程做更詳細的介紹。

 

1,http://www.fireflies.me/2014/01/%E4%B8%89%E3%80%81hbase%E7%9A%84rpc%E6%A1%86%E6%9E%B6/

2,http://blog.csdn.net/bryce123phy/article/details/51812239

3,http://blog.csdn.net/JavaMan_chen/article/details/47039517

4,http://www.myexception.cn/database/1874645.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM