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概况的更多相关文章

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

    Hbase源码分析:Hbase UI中Requests Per Second的具体含义 让运维加监控,被问到Requests Per Second(见下图)的具体含义是什么?我一时竟回答不上来,虽然大 ...

  2. HBase源码分析:HTable put过程

    HBase版本:0.94.15-cdh4.7.0 在 HBase中,大部分的操作都是在RegionServer完成的,Client端想要插入.删除.查询数据都需要先找到相应的 RegionServer ...

  3. Openstack Nova 源码分析 — RPC 远程调用过程

    目录 目录 Nova Project Services Project 的程序入口 setuppy Nova中RPC远程过程调用 nova-compute RPC API的实现 novacompute ...

  4. Hbase源码分析:server端RPC

    server端rpc包括master和RegionServer.接下来主要梳理一下,master和regionserver中有关rpc创建,启动以及处理的过程. 1,server rpc的初始化过程 ...

  5. HBase源码分析之WAL

    WAL(Write-Ahead Logging)是数据库系统中保障原子性和持久性的技术,通过使用WAL可以将数据的随机写入变为顺序写入,可以提高数据写入的性能.在hbase中写入数据时,会将数据写入内 ...

  6. hbase源码分析:ERROR: Table already exists问题诊断

    问题描述: 重新安装了测试环境的hadoop,所以之前hbase所建的表数据都丢失了,但是zookeeper没有动.在hbase shell中list的时候,看不到之前建的表,但是create tes ...

  7. Hbase写入hdfs源码分析

    版权声明:本文由熊训德原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/258 来源:腾云阁 https://www.qclo ...

  8. Hbase WAL线程模型源码分析

    版权声明:本文由熊训德原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/257 来源:腾云阁 https://www.qclo ...

  9. Spark RPC框架源码分析(一)简述

    Spark RPC系列: Spark RPC框架源码分析(一)运行时序 Spark RPC框架源码分析(二)运行时序 Spark RPC框架源码分析(三)运行时序 一. Spark rpc框架概述 S ...

随机推荐

  1. FFmpeg的HEVC解码器源码简单分析:概述

    ===================================================== HEVC源码分析文章列表: [解码 -libavcodec HEVC 解码器] FFmpeg ...

  2. tomcat用80port能够启动,可是浏览器不显示tomcat首页

    一.打开执行(ctrl+r)->输入cmd->确定->输入netstat -ano 结果检測到 :80port被system 占用,如图所看到的 打开进程发现确实被 PID为 4 的 ...

  3. 通过android XML 创建图形,降低对美工的依赖

    在开发中总会须要自己定义各种View的样式,假设总是依赖美工作图弄出须要的UI样式图片(比方:一个button要选中和默认两张图片),不但时间上会浪费.往往也会有适配问题. 尽管能够通过.9图来解决一 ...

  4. iOS UI03_LTView

    // //  LTView.h //  OC03_LTView // //  Created by dllo on 15/7/31. //  Copyright (c) 2015年 dllo. All ...

  5. StringBuffer疑问

    为何结果为AB.B? public static void main(String[] args) { StringBuffer a=new StringBuffer("A"); ...

  6. 2013级C++第12周(春)项目——成员的訪问属性、多重继承

    课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 第一部分 程序阅读 1.阅读程序.分析类中成员 ...

  7. 同一台机子 打开两个tomcat

    由于项目測试须要.须要在机子上单独搭建一个图片server,所以就要同一时候打开两个tomcat,这里记录方法. 1. 首先复制一个新的tomcat程序: 2.在新的tomcat程序中改动server ...

  8. C# TextBox改变高度的方法(转载)

    最近在做C# Winform项目,需要有一个能动态调整大小的Textbox,并且要是单行的.试了几次,单行模式的Textbox不能直接改高度.于是搜索了一下,整理出几个改变高度的方法. 1.将Text ...

  9. BestCoder Round #56/hdu5463 Clarke and minecraft 水题

    Clarke and minecraft 问题描述 克拉克是一名人格分裂患者.某一天,克拉克分裂成了一个游戏玩家,玩起了minecraft.渐渐地,克拉克建起了一座城堡. 有一天,克拉克为了让更多的人 ...

  10. 【bzoj4604】The kth maximum number

    暴力 #include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> ...