hbase rpc这点事
年前的时候系统梳理了一下hbase rpc的实现,并且对组里的小伙伴做了一次分享。趁着热乎劲还没完全消失殆尽,准备赶紧记录下来。
hbase中rpc概况
作为一个分布式系统,hbase的设计是典型的master-salve架构。hbase中主要有master,regionserver,client这三个角色。这三个角色之间rpc的调用关系可以用下图来描述。
client
client有很多,比方说:hbase shell, Java client API等。client没有提供任何rpc服务,它只是调用RegionServer或者master提供的服务。
Master
master主要实现了MasterService和RegionServerStatus协议,分别供Client和RegionServer调用。
MasterService
MasterService主要定义了获取集群状态,以及获取表的元信息,添加/删除列,assign region, enable/disable table,负载均衡等DML相关的一些服务。而Master提供了对这些服务的实现,并且供客户端去调用。比方说,当我们在hbase shell中运行enable/disable table等相关的命令时,client会首先将该rpc请求发送到master。
RegionServerStatus
RegionServerStatus主要定义了regionserver向master汇报集群状态,regionserver启动向master发送rpc请求等相关的服务,而master根据这些rpc请求信息,可以了解整个集群中regionserver的状态。
ReginServer
RegionServer主要实现了AdminService和ClientService协议,供client端调用。而与此同时,ReginServer也会调用RegionServerStatus服务,将相关信息汇报给master。
AdminService
AmdinService主要定义了获取table Regin信息,操作region(Open,Flush,Split,Compact, Merge等)相关服务。
ClientService
ClientService主要定了获取数据,更新,添加数据,Scan等相关的服务。
问题
通过上图,我们发现Master分别提供了对Client和RegionServer的Rpc服务,但是RegionServer却只提供了对client的Rpc服务,而没有提供对Master的rpc的服务。那么当Master怎么向Client发送请求的呢?比方说master启动负载均衡时,需要让regionServer移动region。
答案其实就是通过zookeeper。那为什么会这样呢?
对于整个问题一个可能的解释是:当Master向RegionServer传递信息时,可能需要向多台reginserver传递信息。而通过zookeeper中的node简单变化主动通知regionserver可能更好。(分享时,组里的小伙伴给出的解析,感觉确实是这样)。
Client端rpc实现
使用方式
client发起远程调用时,首先生成一个RpcClient的实例(具体实现类是RpcClientImpl),然后调用call参数(传入方法名称,参数等)。代码实例如下:
1
2
|
RpcClient client = new RpcClientImpl(conf, HConstants.CLUSTER_ID_DEFAULT);
client.call(...)
|
client rpc流程
client端rpc实现的主要流程如下图:
主要分为以下几个步骤:
1,client调用call方法后,首先会把传入的参数封装成Call对象(该对象包含方法名称,调用参数,连接地址等信息),并且根据该对象获取连接信息。client端有一个Map对象connections,缓存了连接信息。如果之前有对应的连接则直接获取,否则新建连接并且缓存起来。
2,client端通过调用sendCall函数,生成CallFuture对象,并且将该对象push到CallsToWrite队列中。然后便一直等待本地调用是否成功返回,无论结果如何都将删除之前在callSender中创建的CallFuture对象,然后把结果包装成Pair<message, cellscanner="">返回。
3,另一方面,CallSender线程持续从CallsToWrite队列中获取步骤2中push进去的对象,生成Request请求发送到server端,并且把当前的call对象push到connection的calls中。
4,此后,Connection中run方法持续从步骤3的calls队列读取已发送的请求,检查结果是否从server返回,一旦返回将构造对应的response保存到call中。
Server端Rpc实现
server的实现相比较client端要复杂很多。server端rpc的实现的原理主要是基于异步事件响应设计。主要流程如下图所示:
1,server端的实现逻辑主要封装在rpcserver对象中,在该对象中,首先有一个Listener对象,负责监控连接请求,一旦有连接,Lister会选择一个Reader,并且在新建的连接上注册OP_READ时间,封装中Connection对象。一般只有一个Listener对象。
2,Reader首先从连接中读取数据,最终构造成callRunner,交由调度器调度。rpcserver对象中一般会有多个Reader对象。
3,根据调度器选择的一个callRunner对象,调用CallRunner:Run->RpcServer:call,从而调用具体函数的实现。
4,函数返回结果后,包装成response对象,并且通过doResponse函数将当前的Call push到responseQueue中, 而且将当前conn Responder需要写到writingCons中。
5,注册步骤4中writingCons中连接的OP_WRITE事件,从responseQueue中获取call,并且进行处理,将结果的byte流发送出出去。
调度策略
调度的基本设计图如下:
在server实现过程中,讲到调度器,hbase rpc实现了两种调度器(FifoRpcScheduler和SimpleRpcScheduler)。FifoRpcScheduler会直接将CallRunner对象放到线程池中去执行。而SimpleRpcScheduler,会分成三种不同的executor,对于不同的请求,使用的不同的executor去执行。
小结
通过对hbase rpc的梳理总结,算是对hbase rpc有了较为深入的理解。rpc可以认为是hbase这个系统的血液循环系统,熟悉了rpc,对于学习hbase其他部分的实现原理也大有裨益。
hbase rpc这点事的更多相关文章
- Apache HBase RPC身份验证中间人安全措施绕过漏洞(CVE-2013-2193)
漏洞版本: Apache Group HBase 0.94.x Apache Group HBase 0.92.x 漏洞描述: BUGTRAQ ID: 61981 CVE(CAN) ID: CVE-2 ...
- 被喷了!聊聊我开源的RPC框架那些事
前段时间利用业余时间写了一个简单的 RPC 框架,花费了不少精力.开源出来之后,少部分不太友好的技术人站在上帝视角说了风凉话.就很难受,兄弟,谁还没有一个玻璃心. 简单吐槽一波,给大家聊聊关于 gui ...
- Hbase源码分析:server端RPC
server端rpc包括master和RegionServer.接下来主要梳理一下,master和regionserver中有关rpc创建,启动以及处理的过程. 1,server rpc的初始化过程 ...
- Hbase源码分析:RPC概况
RPC是hbase中Master,RegionServer和Client三者之间通信交流的纽带.了解hbase的rpc机制能够为通过源码学习hbase奠定良好的基础.因为了解了hbase的rpc机制能 ...
- hbase之RPC详解
Hbase的RPC主要由HBaseRPC.RpcEngine.HBaseClient.HBaseServer.VersionedProtocol 5个概念组成. 1.HBaseRPC是hbase RP ...
- hbase官方文档(转)
FROM:http://www.just4e.com/hbase.html Apache HBase™ 参考指南 HBase 官方文档中文版 Copyright © 2012 Apache Soft ...
- 利用Phoenix为HBase创建二级索引
为什么需要Secondary Index 对于Hbase而言,如果想精确地定位到某行记录,唯一的办法是通过rowkey来查询.如果不通过rowkey来查找数据,就必须逐行地比较每一列的值,即全表扫瞄. ...
- HBase官方文档
HBase官方文档 目录 序 1. 入门 1.1. 介绍 1.2. 快速开始 2. Apache HBase (TM)配置 2.1. 基础条件 2.2. HBase 运行模式: 独立和分布式 2.3. ...
- hbase协处理器编码实例
Observer协处理器通常在一个特定的事件(诸如Get或Put)之前或之后发生,相当于RDBMS中的触发器.Endpoint协处理器则类似于RDBMS中的存储过程,因为它可以让你在RegionSer ...
随机推荐
- 开源yYmVc项目,邀您和我一起开发:)
打算在闲暇时间写个MVC框架,要有什么功能一步一步边写边加,仿照struts 2 和 spring mvc.假设您感兴趣的话,能够私密我,给您加入key:). 欢迎您的到来~ 项目放在基于GIT的CS ...
- 【转】TestNG常用注解
http://blog.csdn.net/d6619309/article/details/52435084 TestNG的注解大部分用在方法级别上.常用的注解列举如下: 1. Before类别和Af ...
- LoadRunner系列之—-03 用Java Vuser协议编写接口测试脚本
待测试接口用java语言实现,且项目中调用该接口需要用专门的jar包.这种情况可以用Java Vuser协议实现接口调用脚本,类似java代码. 代码样例如下: /* * LoadRunner Jav ...
- 初步认识Tensorflow
不多说,直接上干货! TensorFlow 是一个开源软件库,用于使用数据流图进行数值计算.换句话说,即是构建深度学习模型的最佳方式. Tensorflow的官网 https://www.tensor ...
- VUE组件如何与iframe通信问题
vue组件内嵌一个iframe,现在想要在iframe内获取父vue组件内信息,由于本人技术有限,采用的是H5新特性PostMessage来解决跨域问题. postMessage内涵两个API: on ...
- IO流(SequenceInputStream序列流--文件拆分与合并)
一.文件拆分 1.将一个文件按照规定的大小进行分割成多个文件并将被分割详细信息保存至配置信息中 Properties 类表示了一个持久的属性集.Properties 可保存在流中或从流中加载,属性列表 ...
- Ubuntu 12.10终端Terminal快捷方式调用
1:使用快捷键:ctrl+alt+t 打开终端 2:在终端上右键,选“Lock to launcher” 这样就锁定在左侧了,需要用时,直接点就打开了.
- YTU 2416: C语言习题 成绩输出
2416: C语言习题 成绩输出 时间限制: 1 Sec 内存限制: 128 MB 提交: 1111 解决: 417 题目描述 输入n(<=10)个学生的姓名.学号和成绩,将其中不及格者的姓 ...
- Android NDK生成及连接静态库与动态库
对于Android应用开发,大部分情况下我们使用Java就能完整地实现一个应用.但是在某些情况下,我们需要借助C/C++来写JNI本地代码.比如,在使用跨平台的第三方库的时候:为了提升密集计算性能的时 ...
- 并不对劲的bzoj4868: [Shoi2017]期末考试
传送门-> 三分裸题. 发现答案只和最后一个科目公布成绩的时间有关. 科目公布成绩的时间越早,老师们的不愉快度越高,这个时间越晚,学生们的不愉快度越高. 它看上去像个单峰的,那么就三分好了. 判 ...