HBase源码分析(三) 2021SC@SDUSC
前言
了解hbase的rpc机制能够为通过源码学习hbase奠定良好的基础。RPC是hbase中Master,RegionServer和Client三者之间通信交流的纽带。因为了解了hbase的rpc机制能够很快通过debug深入理解hbase各种机制(比方说flush,compaction,scan等请求)的流程。同时也便于碰到问题时,通过源码分析找到原因。
一、RPC概况
1. RPC是什么
RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。
RPC 调用流程如下:
2. RPC的原理和框架
框架:
-
User
-
User-stub
-
RPCRuntime
-
Server-stub
-
Server
这 5 个部分的关系如下图所示
原理:
RPC 服务方通过 RpcServer 去导出(export)远程接口方法,而客户方通过 RpcClient 去引入(import)远程接口方法。客户方像调用本地方法一样去调用远程接口方法,RPC 框架提供接口的代理实现,实际的调用将委托给代理RpcProxy 。代理封装调用信息并将调用转交给RpcInvoker 去实际执行。在客户端的RpcInvoker 通过连接器RpcConnector 去维持与服务端的通道RpcChannel,并使用RpcProtocol 执行协议编码(encode)并将编码后的请求消息通过通道发送给服务方。
RPC 服务端接收器 RpcAcceptor 接收客户端的调用请求,同样使用RpcProtocol 执行协议解码(decode)。解码后的调用信息传递给RpcProcessor 去控制处理调用过程,最后再委托调用给RpcInvoker 去实际执行并返回调用结果
二、Hbase中RPC概况
HBase中的RPC是RegionServer,Master以及Client(如Hbase shell, JAVA client API)三者之间通信的纽带。RegionServer和Master作为hbase server端部分最核心的两个component,主要是通过提供RPC调用的服务来满足客户端的请求。当然RegionServer和Master之间服务也通过RPC来实现。
1.RegionServer提供的服务
由下面代码片段,可以看到RegionServer提供的RPC服务主要是ClientService和AdminService这两个接口提供的服务。
代码如下(示例):
@Override
protected List<BlockingServiceAndInterface> getServices() {
List<BlockingServiceAndInterface> bssi = new ArrayList<>(5);
bssi.add(new BlockingServiceAndInterface(
MasterService.newReflectiveBlockingService(this),
MasterService.BlockingInterface.class));
bssi.add(new BlockingServiceAndInterface(
RegionServerStatusService.newReflectiveBlockingService(this),
RegionServerStatusService.BlockingInterface.class));
bssi.add(new BlockingServiceAndInterface(LockService.newReflectiveBlockingService(this),
LockService.BlockingInterface.class));
bssi.add(new BlockingServiceAndInterface(HbckService.newReflectiveBlockingService(this),
HbckService.BlockingInterface.class));
bssi.add(new BlockingServiceAndInterface(ClientMetaService.newReflectiveBlockingService(this),
ClientMetaService.BlockingInterface.class));
bssi.addAll(super.getServices());
return bssi;
}
其中,ClientServices接口定义如下,可以看到主要是提供数据操作的接口(Get,Mutate,scan等等)
代码如下(示例):
service ClientService {
rpc Get(GetRequest)
returns(GetResponse);
rpc Mutate(MutateRequest)
returns(MutateResponse);
rpc Scan(ScanRequest)
returns(ScanResponse);
rpc BulkLoadHFile(BulkLoadHFileRequest)
returns(BulkLoadHFileResponse);
rpc PrepareBulkLoad(PrepareBulkLoadRequest)
returns (PrepareBulkLoadResponse);
rpc CleanupBulkLoad(CleanupBulkLoadRequest)
returns (CleanupBulkLoadResponse);
rpc ExecService(CoprocessorServiceRequest)
returns(CoprocessorServiceResponse);
rpc ExecRegionServerService(CoprocessorServiceRequest)
returns(CoprocessorServiceResponse);
rpc Multi(MultiRequest)
returns(MultiResponse);
}
AdminService的服务定义如下, 可以看到主要提供hbase表管理相关的操作,region的合并,split等等。
service AdminService {
rpc CloseRegion(CloseRegionRequest)
returns(CloseRegionResponse);
rpc FlushRegion(FlushRegionRequest)
returns(FlushRegionResponse);
rpc SplitRegion(SplitRegionRequest)
returns(SplitRegionResponse);
rpc CompactRegion(CompactRegionRequest)
returns(CompactRegionResponse);
rpc MergeRegions(MergeRegionsRequest)
returns(MergeRegionsResponse);
rpc ReplicateWALEntry(ReplicateWALEntryRequest)
returns(ReplicateWALEntryResponse);
rpc Replay(ReplicateWALEntryRequest)
returns(ReplicateWALEntryResponse);
rpc RollWALWriter(RollWALWriterRequest)
returns(RollWALWriterResponse);
rpc GetServerInfo(GetServerInfoRequest)
returns(GetServerInfoResponse);
rpc StopServer(StopServerRequest)
returns(StopServerResponse);
rpc UpdateFavoredNodes(UpdateFavoredNodesRequest)
returns(UpdateFavoredNodesResponse);
rpc UpdateConfiguration(UpdateConfigurationRequest)
returns(UpdateConfigurationResponse);
}
2.Master提供的服务
由下面代码片段,可以看到Master主要四个接口的服务。MasterService和RegionServerStatusService,以及super.getServices()就是ClientServices和AdminService。
@Override
protected List<BlockingServiceAndInterface> getServices() {
List<BlockingServiceAndInterface> bssi = new ArrayList<>(5);
bssi.add(new BlockingServiceAndInterface(
MasterService.newReflectiveBlockingService(this),
MasterService.BlockingInterface.class));
bssi.add(new BlockingServiceAndInterface(
RegionServerStatusService.newReflectiveBlockingService(this),
RegionServerStatusService.BlockingInterface.class));
bssi.add(new BlockingServiceAndInterface(LockService.newReflectiveBlockingService(this),
LockService.BlockingInterface.class));
bssi.add(new BlockingServiceAndInterface(HbckService.newReflectiveBlockingService(this),
HbckService.BlockingInterface.class));
bssi.add(new BlockingServiceAndInterface(ClientMetaService.newReflectiveBlockingService(this),
ClientMetaService.BlockingInterface.class));
bssi.addAll(super.getServices());
return bssi;
}
MasterService的服务定义部分如下, 可以看到主要提供表DML相关的服务。
service MasterService {
/** Used by the client to get the number of regions that have received the updated schema */
rpc GetSchemaAlterStatus(GetSchemaAlterStatusRequest)
returns(GetSchemaAlterStatusResponse);
/** Get list of TableDescriptors for requested tables. */
rpc GetTableDescriptors(GetTableDescriptorsRequest)
returns(GetTableDescriptorsResponse);
/** Get the list of table names. */
rpc GetTableNames(GetTableNamesRequest)
returns(GetTableNamesResponse);
/** Return cluster status. */
rpc GetClusterStatus(GetClusterStatusRequest)
returns(GetClusterStatusResponse);
/** return true if master is available */
rpc IsMasterRunning(IsMasterRunningRequest) returns(IsMasterRunningResponse);
/** Adds a column to the specified table. */
rpc AddColumn(AddColumnRequest)
returns(AddColumnResponse);
/** Deletes a column from the specified table. Table must be disabled. */
rpc DeleteColumn(DeleteColumnRequest)
returns(DeleteColumnResponse);
/** Modifies an existing column on the specified table. */
rpc ModifyColumn(ModifyColumnRequest)
returns(ModifyColumnResponse);
......}
而RegionServerStatusService主要是与regionserver状态有关的接口。
service RegionServerStatusService {
/** Called when a region server first starts. */
rpc RegionServerStartup(RegionServerStartupRequest)
returns(RegionServerStartupResponse);
/** Called to report the load the RegionServer is under. */
rpc RegionServerReport(RegionServerReportRequest)
returns(RegionServerReportResponse);
/**
* Called by a region server to report a fatal error that is causing it to
* abort.
*/
rpc ReportRSFatalError(ReportRSFatalErrorRequest)
returns(ReportRSFatalErrorResponse);
/** Called to get the sequence id of the last MemStore entry flushed to an
* HFile for a specified region. Used by the region server to speed up
* log splitting. */
rpc GetLastFlushedSequenceId(GetLastFlushedSequenceIdRequest)
returns(GetLastFlushedSequenceIdResponse);
/**
* Called by a region server to report the progress of a region
* transition. If the request fails, the transition should
* be aborted.
*/
rpc ReportRegionStateTransition(ReportRegionStateTransitionRequest)
returns(ReportRegionStateTransitionResponse);
/**
* Reports Region filesystem space use
*/
rpc ReportRegionSpaceUse(RegionSpaceUseReportRequest)
returns(RegionSpaceUseReportResponse);
rpc ReportProcedureDone(ReportProcedureDoneRequest)
returns(ReportProcedureDoneResponse);
/** Reports files that were moved to the archive directory for space quotas */
rpc ReportFileArchival(FileArchiveNotificationRequest)
returns(FileArchiveNotificationResponse);
}
3.HBase中RPC的总体框架
hbase中server中有关rpc的类和成员的之间的包含和继承关系如下图所示:
从上图可以看到Master继承了HRegionServer,而在HRegionServer中包含了rpcServices,具体点对于HRegionServer对应为RSRpcServices,而HMaste对应MasterRpcServices。而RSRpcServices中包含了RpcServer,这个类主要用来服务rpc。其中Listener负责监听请求,对于获取到的请求,交由Reader负责读取,Resonder负责发送rpc请求结果,而RpcScheduler负责任务的调度。
三.总结
这里对文章进行总结:
以上就是今天要讲的内容,本文仅仅简单介绍了RPC的原理以及框架,对Hbase的rpc 部分有了一个概括性的认识,接下来会有对关于其他部分的详细介绍。