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

 1   protected List<BlockingServiceAndInterface> getServices() {
 2     List<BlockingServiceAndInterface> bssi = new ArrayList<BlockingServiceAndInterface>(2);
 3     bssi.add(new BlockingServiceAndInterface(
 4       ClientService.newReflectiveBlockingService(this),
 5       ClientService.BlockingInterface.class));
 6     bssi.add(new BlockingServiceAndInterface(
 7       AdminService.newReflectiveBlockingService(this),
 8       AdminService.BlockingInterface.class));
 9     return bssi;
10   }

其中,ClientServices接口定义如下,可以看到主要是提供数据操作的接口(Get,Mutate,scan等等)

 1 service ClientService {
 2   rpc Get(GetRequest)
 3     returns(GetResponse);
 4
 5   rpc Mutate(MutateRequest)
 6     returns(MutateResponse);
 7
 8   rpc Scan(ScanRequest)
 9     returns(ScanResponse);
10
11   rpc BulkLoadHFile(BulkLoadHFileRequest)
12     returns(BulkLoadHFileResponse);
13
14   rpc ExecService(CoprocessorServiceRequest)
15     returns(CoprocessorServiceResponse);
16
17   rpc ExecRegionServerService(CoprocessorServiceRequest)
18     returns(CoprocessorServiceResponse);
19
20   rpc Multi(MultiRequest)
21     returns(MultiResponse);
22 }

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

 1 service AdminService {
 2   rpc GetRegionInfo(GetRegionInfoRequest)
 3     returns(GetRegionInfoResponse);
 4
 5   rpc GetStoreFile(GetStoreFileRequest)
 6     returns(GetStoreFileResponse);
 7
 8   rpc GetOnlineRegion(GetOnlineRegionRequest)
 9     returns(GetOnlineRegionResponse);
10
11   rpc OpenRegion(OpenRegionRequest)
12     returns(OpenRegionResponse);
13
14   rpc WarmupRegion(WarmupRegionRequest)
15     returns(WarmupRegionResponse);
16
17   rpc CloseRegion(CloseRegionRequest)
18     returns(CloseRegionResponse);
19
20   rpc FlushRegion(FlushRegionRequest)
21     returns(FlushRegionResponse);
22   ...52 }

2.2, Master提供的服务

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

 1   protected List<BlockingServiceAndInterface> getServices() {
 2     List<BlockingServiceAndInterface> bssi = new ArrayList<BlockingServiceAndInterface>(4);
 3     bssi.add(new BlockingServiceAndInterface(
 4       MasterService.newReflectiveBlockingService(this),
 5       MasterService.BlockingInterface.class));
 6     bssi.add(new BlockingServiceAndInterface(
 7       RegionServerStatusService.newReflectiveBlockingService(this),
 8       RegionServerStatusService.BlockingInterface.class));
 9     bssi.addAll(super.getServices());
10     return bssi;
11   }

MasterService的服务定义部分如下, 可以看到主要提供表DML相关的服务。

  1 service MasterService {
  2   /** Used by the client to get the number of regions that have received the updated schema */
  3   rpc GetSchemaAlterStatus(GetSchemaAlterStatusRequest)
  4     returns(GetSchemaAlterStatusResponse);
  5
  6   /** Get list of TableDescriptors for requested tables. */
  7   rpc GetTableDescriptors(GetTableDescriptorsRequest)
  8     returns(GetTableDescriptorsResponse);
  9
 10   /** Get the list of table names. */
 11   rpc GetTableNames(GetTableNamesRequest)
 12     returns(GetTableNamesResponse);
 13
 14   /** Return cluster status. */
 15   rpc GetClusterStatus(GetClusterStatusRequest)
 16     returns(GetClusterStatusResponse);
 17
 18   /** return true if master is available */
 19   rpc IsMasterRunning(IsMasterRunningRequest) returns(IsMasterRunningResponse);
 20
 21   /** Adds a column to the specified table. */
 22   rpc AddColumn(AddColumnRequest)
 23     returns(AddColumnResponse);
 24
 25   /** Deletes a column from the specified table. Table must be disabled. */
 26   rpc DeleteColumn(DeleteColumnRequest)
 27     returns(DeleteColumnResponse);
 28
 29   /** Modifies an existing column on the specified table. */
 30   rpc ModifyColumn(ModifyColumnRequest)
 31     returns(ModifyColumnResponse);
 32
 33   /** Move the region region to the destination server. */
 34   rpc MoveRegion(MoveRegionRequest)
 35     returns(MoveRegionResponse);
 36   ...236 }

而RegionServerStatusService主要是与regionserver状态有关的接口。

 1 service RegionServerStatusService {
 2   /** Called when a region server first starts. */
 3   rpc RegionServerStartup(RegionServerStartupRequest)
 4     returns(RegionServerStartupResponse);
 5
 6   /** Called to report the load the RegionServer is under. */
 7   rpc RegionServerReport(RegionServerReportRequest)
 8     returns(RegionServerReportResponse);
 9
10   /**
11    * Called by a region server to report a fatal error that is causing it to
12    * abort.
13    */
14   rpc ReportRSFatalError(ReportRSFatalErrorRequest)
15     returns(ReportRSFatalErrorResponse);
16
17   /** Called to get the sequence id of the last MemStore entry flushed to an
18    * HFile for a specified region. Used by the region server to speed up
19    * log splitting. */
20   rpc GetLastFlushedSequenceId(GetLastFlushedSequenceIdRequest)
21     returns(GetLastFlushedSequenceIdResponse);
22
23   /**
24    * Called by a region server 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(ReportRegionStateTransitionResponse);
30 }

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

时间: 2024-07-30 15:59:35

Hbase源码分析:RPC概况的相关文章

Hbase源码分析:Hbase UI中Requests Per Second的具体含义

让运维加监控,被问到Requests Per Second(见下图)的具体含义是什么?我一时竟回答不上来,虽然大概知道它是指每秒Region Server的请求数,但是具体是怎么算的呢,不清楚.于是决定通过研究源码深入了解下.下面便记录了这个过程. 1,先在代码库中全局搜索Requests Per Second关键字,发现在几个jamon结尾的文件找到了.于是google了一下,这个到底是什么东东,发现是一个模板引擎. 2,查看RegionServerListTmpl.jamon内容,需要传入参

Hadoop源码分析----RPC反射机制

有了Client 和Server,很自然就能RPC 啦.下面轮到RPC.java 啦.一般来说,分布式对象一般都会要求根据接口生成存根和框架.如CORBA,可以通过IDL,生成存根和框架.但是,在org.apache.hadoop.rpc,我们就不需要这样的步骤了.上类图. 为了分析Invoker,我们需要介绍一些Java 反射实现Dynamic Proxy 的背景.Dynamic Proxy 是由两个class 实现的:java.lang.reflect.Proxy 和java.lang.re

HBase源码分析之KeyValue

HBase内部,单元格Cell的实现为KeyValue,它是HBase某行数据的某个单元格在内存中的组织形式,由Key Length.Value Length.Key.Value四大部分组成.其中,Key又由Row Length.Row.Column Family Length.Column Family.Column Qualifier.Time Stamp.Key Type七部分组成.在HBase1.0.2版本中,它的结构如图: 从左到右,依次为: 1.Key Length:存储Key的长度

兄弟连区块链入门教程eth源码分析RPC分析

这是一个交互式的 JavaScript 执行环境,在这里面可以执行 JavaScript 代码,其中 > 是命令提示符.在这个环境里也内置了一些用来操作eth的 JavaScript 对象,可以直接使用这些对象.这些对象主要包括: eth:包含一些跟操作区块链相关的方法:net:包含一些查看p2p网络状态的方法:admin:包含一些与管理节点相关的方法:miner:包含启动&停止挖矿的一些方法:personal:主要包含一些管理账户的方法:txpool:包含一些查看交易内存池的方法:web3

Hbase写入hdfs源码分析

版权声明:本文由熊训德原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/258 来源:腾云阁 https://www.qcloud.com/community 本文档从源码角度分析了,hbase作为dfs client写入hdfs的hadoop sequence文件最终刷盘落地的过程.之前在<wal线程模型源码分析>中描述wal的写过程时说过会写入hadoop sequence文件,hbase为了保证数据的安全性,一般都

Flume NG源码分析(五)使用ThriftSource通过RPC方式收集日志

上一篇说了利用ExecSource从本地日志文件异步的收集日志,这篇说说采用RPC方式同步收集日志的方式.笔者对Thrift比较熟悉,所以用ThriftSource来介绍RPC的日志收集方式. 整体的结构图如下: 1. ThriftSource包含了一个Thrift Server,以及一个Thrift Service服务的实现.这里的Thrift Service是由ThriftSourceProtocol定义 2. 应用程序调用Thrift Service的客户端,以RPC的方式将日志发送到Th

细水长流Hadoop源码分析(3)RPC Server初始化构造

声明:个人原创,转载请注明出处.文中引用了一些网上或书里的资料,如有不妥之处请告之. 本文是我阅读Hadoop 0.20.2第二遍时写的笔记,在阅读过程中碰到很多问题,最终通过各种途径解决了大部分.Hadoop整个系统设计精良,源码值得学习分布式的同学们阅读,以后会将所有笔记一一贴出,希望能方便大家阅读源码,少走弯路. 目录 4 RPC服务器(org.apache.hadoop,ipc.Server) 4.1 服务器初始化 4 RPC服务器(org.apache.hadoop,ipc.Serve

Hadoop2源码分析-YARN RPC 示例介绍

1.概述 之前在<Hadoop2源码分析-RPC探索实战>一文当中介绍了Hadoop的RPC机制,今天给大家分享关于YARN的RPC的机制.下面是今天的分享目录: YARN的RPC介绍 YARN的RPC示例 截图预览 下面开始今天的内容分享. 2.YARN的RPC介绍 我们知道在Hadoop的RPC当中,其主要由RPC,Client及Server这三个大类组成,分别实现对外提供编程接口.客户端实现及服务端实现.如下图所示: 图中是Hadoop的RPC的一个类的关系图,大家可以到<Hado

hbase split 源码分析之split策略

在工作中接触到split,于是查看了这块的源代码,先看到了split的策略,今天就说说这个吧,后续还会有split的其他源码分析和compact相关的源码分析. 看了很多其他人的博客,很多都是转发的,原创的也都没有注明是哪个版本.其实给很多读者造成混淆,我这里是基于Hbase-0.98.13  版本作为分析的,注意:不同版本的此部分源码很可能不一样. 在这个版本中使用的split策略是IncreasingToUpperBoundRegionSplitPolicy.确切来说他是0.94版本以后的策