HBase源码分析(三) 2021SC@SDUSC

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的原理和框架

框架:

  1. User

  2. User-stub

  3. RPCRuntime

  4. Server-stub

  5. 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 部分有了一个概括性的认识,接下来会有对关于其他部分的详细介绍。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值