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这两个接口提供的服务。

   protected List<BlockingServiceAndInterface> getServices() {
List<BlockingServiceAndInterface> bssi = new ArrayList<BlockingServiceAndInterface>(2);
bssi.add(new BlockingServiceAndInterface(
ClientService.newReflectiveBlockingService(this),
ClientService.BlockingInterface.class));
bssi.add(new BlockingServiceAndInterface(
AdminService.newReflectiveBlockingService(this),
AdminService.BlockingInterface.class));
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 ExecService(CoprocessorServiceRequest)
returns(CoprocessorServiceResponse); rpc ExecRegionServerService(CoprocessorServiceRequest)
returns(CoprocessorServiceResponse); rpc Multi(MultiRequest)
returns(MultiResponse);
}

AdminService的服务定义如下, 可以看到主要提供hbase表管理相关的操作,region的合并,split等等。

 service AdminService {
rpc GetRegionInfo(GetRegionInfoRequest)
returns(GetRegionInfoResponse); rpc GetStoreFile(GetStoreFileRequest)
returns(GetStoreFileResponse); rpc GetOnlineRegion(GetOnlineRegionRequest)
returns(GetOnlineRegionResponse); rpc OpenRegion(OpenRegionRequest)
returns(OpenRegionResponse); rpc WarmupRegion(WarmupRegionRequest)
returns(WarmupRegionResponse); rpc CloseRegion(CloseRegionRequest)
returns(CloseRegionResponse); rpc FlushRegion(FlushRegionRequest)
returns(FlushRegionResponse);
... }

2.2, Master提供的服务

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

   protected List<BlockingServiceAndInterface> getServices() {
List<BlockingServiceAndInterface> bssi = new ArrayList<BlockingServiceAndInterface>(4);
bssi.add(new BlockingServiceAndInterface(
MasterService.newReflectiveBlockingService(this),
MasterService.BlockingInterface.class));
bssi.add(new BlockingServiceAndInterface(
RegionServerStatusService.newReflectiveBlockingService(this),
RegionServerStatusService.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); /** Move the region region to the destination server. */
rpc MoveRegion(MoveRegionRequest)
returns(MoveRegionResponse);
... }

而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);
}

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

最新文章

  1. LaunchImage命名与AppIcon命名(ios设置 启动图片和AppIcon图片)
  2. How to add EDT relation table[AX2012]
  3. Java_Hbase Timeout issue
  4. MSP430常见问题之电源类
  5. Android(一)
  6. ssh 如何通过外网访问内网多台服务器
  7. windows环境下配置zookeeper
  8. Linux学习——shell编程之变量
  9. [国嵌笔记][010][TFTP与NFS服务器配置]
  10. Java中的变量数据类型补充
  11. DevExpress XtraTabbedMdiManager删除Page
  12. 升级到 Android Studio 3.0 + Gradle 4.1 遇到的一些坑及解决方案
  13. “百度杯”CTF比赛 九月场---123
  14. 【Java】生成图形验证码
  15. 【TP3.2+onethink1.0】2个Ueditor 回显数据,第2个会把第1个覆盖
  16. head first java读书笔记
  17. ubuntu 下 mysql数据库的搭建 及 数据迁移
  18. 判断一个数是否是4的n次方
  19. onSaveInstanceState
  20. WebHDFS vs HttpFS GateWay

热门文章

  1. Layui图标
  2. 洛谷——P1062 数列
  3. 创建简单的spring-mvc项目
  4. java反射-使用反射来操纵方法
  5. Android Api Demos登顶之路(四十五)Loader--&amp;gt;Cursor
  6. Zabbix ---proxy 代理
  7. web网站架构演变过程
  8. mysql复制延迟监控脚本
  9. 8.跟我学solr---UpdateRequestProcessor具体解释
  10. 混合式框架-AgileLite