Hbase源码分析:RPC概况
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
Hbase源码分析:RPC概况的更多相关文章
- Hbase源码分析:Hbase UI中Requests Per Second的具体含义
		
Hbase源码分析:Hbase UI中Requests Per Second的具体含义 让运维加监控,被问到Requests Per Second(见下图)的具体含义是什么?我一时竟回答不上来,虽然大 ...
 - HBase源码分析:HTable put过程
		
HBase版本:0.94.15-cdh4.7.0 在 HBase中,大部分的操作都是在RegionServer完成的,Client端想要插入.删除.查询数据都需要先找到相应的 RegionServer ...
 - Openstack Nova 源码分析 — RPC 远程调用过程
		
目录 目录 Nova Project Services Project 的程序入口 setuppy Nova中RPC远程过程调用 nova-compute RPC API的实现 novacompute ...
 - Hbase源码分析:server端RPC
		
server端rpc包括master和RegionServer.接下来主要梳理一下,master和regionserver中有关rpc创建,启动以及处理的过程. 1,server rpc的初始化过程 ...
 - HBase源码分析之WAL
		
WAL(Write-Ahead Logging)是数据库系统中保障原子性和持久性的技术,通过使用WAL可以将数据的随机写入变为顺序写入,可以提高数据写入的性能.在hbase中写入数据时,会将数据写入内 ...
 - hbase源码分析:ERROR: Table already exists问题诊断
		
问题描述: 重新安装了测试环境的hadoop,所以之前hbase所建的表数据都丢失了,但是zookeeper没有动.在hbase shell中list的时候,看不到之前建的表,但是create tes ...
 - Hbase写入hdfs源码分析
		
版权声明:本文由熊训德原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/258 来源:腾云阁 https://www.qclo ...
 - Hbase WAL线程模型源码分析
		
版权声明:本文由熊训德原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/257 来源:腾云阁 https://www.qclo ...
 - Spark RPC框架源码分析(一)简述
		
Spark RPC系列: Spark RPC框架源码分析(一)运行时序 Spark RPC框架源码分析(二)运行时序 Spark RPC框架源码分析(三)运行时序 一. Spark rpc框架概述 S ...
 
随机推荐
- 用jquery校验radio单选按钮(原创)
			
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head ...
 - 1085 数字游戏  2003年NOIP全国联赛普及组
			
丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易.游戏是这样的,在你面前有一圈整数(一共n个),你要按顺序将其分为m个部分 ...
 - Java度线程——生产消费问题
			
/*JDK1.4版本:生产者,消费者.多生产者,多消费者的问题.if判断标记,只有一次,会导致不该运行的线程运行了.出现了数据错误的情况.while判断标记,解决了线程获取执行权后,是否要运行! no ...
 - Ubuntu16.04安装deb文件时提示:此软件来自第三方且可能包含非自由组件
			
解决方式: 1.在Ubuntu软件中心安装GDebi. 2.安装好之后,选择这个要安装的deb文件右键,打开方式选择GDebi,然后输入管理员密码等待安装,期间如果不行需要重试几次. 3.另外的方法, ...
 - 2、Java并发性和多线程-多线程的优点
			
以下内容转自http://ifeve.com/benefits/: 尽管面临很多挑战,多线程有一些优点使得它一直被使用.这些优点是: 资源利用率更好 程序设计在某些情况下更简单 程序响应更快 资源利用 ...
 - 打造Spring Cloud构建微服务架构的最全资料
			
访问: https://git.oschina.net/didispace/SpringCloud-Learning http://blog.didispace.com/categories/Spri ...
 - git: 保存帐号信息
			
One line command: git config credential.helper store
 - 镜像二叉树——剑指Offer
			
https://www.nowcoder.net/practice/564f4c26aa584921bc75623e48ca3011?tpId=13&tqId=11171&tPage= ...
 - Django学习系列之重写User模型和登录验证
			
重写User模型 Django内置的User模型可能不适合某些项目,我们可能要基于内置的添加一些字段 创建users app startapp users 修改settings.py配置文件,覆盖默认 ...
 - 域名添加HTTPS
			
准备 需要python版本为2.7以上,所以centos6需要把2.6升级成2.7 升级python ###安装python2.7 tar -xvf Python-2.7.5tar.bz2 cd Py ...