HBaRPC理解之⼀
RPC是hba中Master,RegionServer和Client三者之间通信交流的纽带。了解hba的rpc机制能够为通过源码学习hba奠定良好的基础。因为了解了hba的rpc机制能够很快通过debug深⼊理解hba各种机制(⽐⽅说flush,compaction,scan等请求)的流程。同时也便于碰到问题时,通过源码分析找到原因,毕竟源码⾯前了⽆秘密。
1,RPC简介
RPC(remote procedure call)即远程过程调⽤。对于本地调⽤,定义好⼀个函数以后,程序的其他部分通过调⽤该函数,就可以返回想要的结果。⽽RPC唯⼀的区别就是函数定义和函数调⽤通常位于不同的机器,因为涉及到不同的机器,所以RPC相⽐较本地函数调⽤多了通信部分。主要涉及到两个⾓⾊调⽤⽅(client端)和函数定义实现(rver端)。RPC调⽤的流程如下⾯图所⽰()。
志愿服务项目大赛
2,HBa中RPC概况
HBa中的RPC是RegionServer,Master以及Client(如Hba shell, JAVA client API)三者之间通信的纽带。RegionServer和Master作为hba rver端部分最核⼼的两个component,主要是通过提供RPC调⽤的服务来满⾜客户端的请求。当然RegionServer和Master之间服务也通过RPC来实现。
2.1, RegionServer提供的服务
干法稻盛和夫读后感通过下⾯的代码⽚段,可以看到RegionServer提供的RPC服务主要是ClientService和AdminService这两个接⼝提供的服务。
1protected List<BlockingServiceAndInterface> getServices() {
2 List<BlockingServiceAndInterface> bssi = new ArrayList<BlockingServiceAndInterface>(2);
3 bssi.add(new BlockingServiceAndInterface(
4 wReflectiveBlockingService(this),
5 ClientService.BlockingInterface.class));
6 bssi.add(new BlockingServiceAndInterface(
7 wReflectiveBlockingService(this),
8 AdminService.BlockingInterface.class));
9return bssi;
10 }
其中,ClientServices接⼝定义如下,可以看到主要是提供数据操作的接⼝(Get,Mutate,scan等等)
1 rvice ClientService {
2 rpc Get(GetRequest)
3 returns(GetRespon);
4
5 rpc Mutate(MutateRequest)老干妈拌饭
6 returns(MutateRespon);
7
8 rpc Scan(ScanRequest)
9 returns(ScanRespon);
10
11 rpc BulkLoadHFile(BulkLoadHFileRequest)
12 returns(BulkLoadHFileRespon);
13
14 rpc ExecService(CoprocessorServiceRequest)
15 returns(CoprocessorServiceRespon);
16
17 rpc ExecRegionServerService(CoprocessorServiceRequest)
18 returns(CoprocessorServiceRespon);
19
20 rpc Multi(MultiRequest)
21 returns(MultiRespon);
22 }
AdminService的服务定义如下, 可以看到主要提供hba表管理相关的操作,region的合并,split等等。
1 rvice AdminService {
2 rpc GetRegionInfo(GetRegionInfoRequest)
3 returns(GetRegionInfoRespon);
4
5 rpc GetStoreFile(GetStoreFileRequest)
6 returns(GetStoreFileRespon);
7
8 rpc GetOnlineRegion(GetOnlineRegionRequest)
9 returns(GetOnlineRegionRespon);
10
11 rpc OpenRegion(OpenRegionRequest)
12 returns(OpenRegionRespon);
13
14 rpc WarmupRegion(WarmupRegionRequest)
15 returns(WarmupRegionRespon);
16
17 rpc CloRegion(CloRegionRequest)
18 returns(CloRegionRespon);
19
20 rpc FlushRegion(FlushRegionRequest)
21 returns(FlushRegionRespon);
22 ...52 }
2.2, Master提供的服务
通过下⾯的代码⽚段,可以看到Master主要四个接⼝的服务。MasterService和RegionServerStatusService,以及Services()就是ClientServices和AdminService。
1protected List<BlockingServiceAndInterface> getServices() {
2 List<BlockingServiceAndInterface> bssi = new ArrayList<BlockingServiceAndInterface>(4);
3 bssi.add(new BlockingServiceAndInterface(
4 wReflectiveBlockingService(this),
5 MasterService.BlockingInterface.class));
6 bssi.add(new BlockingServiceAndInterface(
7 wReflectiveBlockingService(this),
8 RegionServerStatusService.BlockingInterface.class));
9 bssi.Services());
10return bssi;
11 }
MasterService的服务定义部分如下, 可以看到主要提供表DML相关的服务。
1 rvice MasterService {
2/** Ud by the client to get the number of regions that have received the updated schema */
3 rpc GetSchemaAlterStatus(GetSchemaAlterStatusRequest)
4 returns(GetSchemaAlterStatusRespon);
5
6/** Get list of TableDescriptors for requested tables. */
7 rpc GetTableDescriptors(GetTableDescriptorsRequest)
8 returns(GetTableDescriptorsRespon);
9
10/** Get the list of table names. */
11 rpc GetTableNames(GetTableNamesRequest)
春节联欢晚会重播12 returns(GetTableNamesRespon);
13
14/** Return cluster status. */
15 rpc GetClusterStatus(GetClusterStatusRequest)
瓦合16 returns(GetClusterStatusRespon);
17
18/** return true if master is available */
19 rpc IsMasterRunning(IsMasterRunningRequest) returns(IsMasterRunningRespon);
20
21/** Adds a column to the specified table. */
22 rpc AddColumn(AddColumnRequest)
23 returns(AddColumnRespon);
24
花开花败25/** Deletes a column from the specified table. Table must be disabled. */
26 rpc DeleteColumn(DeleteColumnRequest)
人口最多的国家是27 returns(DeleteColumnRespon);
28
29/** Modifies an existing column on the specified table. */
30 rpc ModifyColumn(ModifyColumnRequest)
31 returns(ModifyColumnRespon);
32
33/** Move the region region to the destination rver. */
34 rpc MoveRegion(MoveRegionRequest)
35 returns(MoveRegionRespon);
36 ...236 }
⽽RegionServerStatusService主要是与regionrver状态有关的接⼝。
1 rvice RegionServerStatusService {
2/** Called when a region rver first starts. */
3 rpc RegionServerStartup(RegionServerStartupRequest)
4 returns(RegionServerStartupRespon);
5
6/** Called to report the load the RegionServer is under. */
7 rpc RegionServerReport(RegionServerReportRequest)
8 returns(RegionServerReportRespon);
9
10/**
孔子弟子排名
11 * Called by a region rver to report a fatal error that is causing it to
12 * abort.
13*/
14 rpc ReportRSFatalError(ReportRSFatalErrorRequest)
15 returns(ReportRSFatalErrorRespon);
16
17/** Called to get the quence id of the last MemStore entry flushed to an
18 * HFile for a specified region. Ud by the region rver to speed up
19 * log splitting. */
20 rpc GetLastFlushedSequenceId(GetLastFlushedSequenceIdRequest)
21 returns(GetLastFlushedSequenceIdRespon);
22
23/**
24 * Called by a region rver 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(ReportRegionStateTransitionRespon);
30 }
3,HBa中RPC的总体框架
hba中rver中有关rpc的类和成员的之间的包含和继承关系如下图所⽰:
从上图可以看到Master继承了HRegionServer,⽽在HRegionServer中包含了rpcServices,具体点对于HRegionServer对应为RSRpcServices,⽽HMaste对应MasterRpcServices。⽽RSRpcServices中包含了RpcServer,这个类主要⽤来服务rpc。其中Listener负责监听请求,对于获取到的请求,交由Reader负责读取,Resonder负责发送rpc请求结果,⽽RpcScheduler负责任务的调度。关于Listener,Responder,Reader和Scheduler之间的流程,稍后再详谈。
4,⼩结
这⾥主要对hba rpc部分做了⼀个宏观的认识,包括rpc介绍,rpc提供的服务以及rpc在hba源码中
的相关类和对象的集成和包含关系。通过整理这些,对hba的rpc有了概括性的了解。接下来会对rver端和client端rpc的过程做更详细的介绍。