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