HBase rpc框架介绍

简介: HBase的rpc框架有比较好的分层,便于在不同层次上进行实现优化和功能扩展。

概述

总体结构如下:
rpc_

客户端

模块介绍

调度执行

该模块主要提供接口转换、错误重试、服务分组等能力;

1:接口转换
服务层定义的服务接口与用户层不同,比如put/delete/increment/append等操作底层都是调用的mutate接口,而batch相关的操作,无论是读还是写都调用multi接口;

转换逻辑封装为一个callable对象,交由RpcRetryingCaller处理;

2:错误重试
RpcRetryingCaller负责与服务代理模块直接交互 ,以及错误时的重试;

3:服务分组
batch相关的操作可能会涉及到多个rs,需要按照rs进行分组,然后多线程并发请求,这些逻辑是在AsyncProcess中;

对于非batch类请求则直接使用RpcRetryingCaller进行调用,AsyncProcess的内部实际上也是依赖了该类来执行单个rs请求;

服务代理

服务代理通常叫stub,即桩的意思,其实现了与服务端同样的接口;
对调度执行模块而言,调用stub的方法就相当于调用远程的服务,而不必关心实现细节;

这部分依赖protobuf组件,通过在proto文件中定义service及message类型的参数,可直接生成接口和stub实现类;

在ConnectionImplementation类中有一个Map类型的stubs变量,其key为service name + regionserver,value则是stub实例;

通信模块

该模块主要进行序列化和io处理;

目前HBase已采用netty作为底层的io框架,客户端的核心类为NettyRpcClient;

服务代理层的stub类中含有一个BlockingRpcChannel类型的变量,而rpcClient通过实现该接口并将实例注入来与之对接;

序列化则是依赖protobuf组件,序列化与反序列化的逻辑都放在NettyRpcDuplexHandler中,该类注册在netty的pipeline,会基于不同的事件自动调用;

组件交互

rpc_

这里面整体调用脉络比较清晰,值得注意的是,应用线程在调用底层io线程进行发送之前,会将请求相关的东西封装到一个call对象里面,然后将其暂存在一个id2call的map中,在拿到返回结果时,根据结果数据中的callId,再从id2call中获取对应的call对象,并唤醒应用线程;

线程交互

分为简单请求和复杂请求两种情况,区别在于是否使用额外的线程池;

简单请求

非multi和scan;

rpc_

复杂请求

multi和scan;

rpc_

服务端

通信模块

该模块主要负责数据的读取、反序列化并封装为call对象;

核心实现类为NettyRpcServer,通过在pipeline中注册的一些handler来完成上述处理;

数据流的格式大致如下:
rpc_

对其处理可分为3个阶段:
1、读取preamble(序文)
这是连接建立后,最先要发送的数据,共有6个字节,格式为"HBasXX",后两位为与版本和校验相关的数字;
相关的handler为FixedLengthFrameDecoder和NettyRpcServerPreambleHandler,前者负责读取定长字节数,后者负责校验内容;

2、读取connectionHeader
该部分包含size和data,读取完前述的preamble之后再读取4个字节即为size,转换后的int即代表了data部分的长度;

connectionHeader用来对连接进行一些约定,比如请求的serviceName、编码、压缩及加密设置等,具体参见RPC.proto文件中的ConnectionHeader;

相关的handler为NettyRpcFrameDecoder和NettyRpcServerRequestDecoder,前者负责读取定长字节得到size以及根据size读取data,后者则通过调用ServerRpcConnection的processConnectionHeader方法进行进一步处理;

connectionHeader只会发送和处理一次,后续的数据就都是request了;

3、读取request
该部分的数据读取部分与connectionHeader一致,区别在于处理方法为ServerRpcConnection的processRequest;

其内部主要包含requestHeader和param两部分;

requestHeader为单次请求的总体描述,比如请求的方法名、优先级、超时时间等,具体参见RPC.proto文件中的RequestHeader;

param为所请求方法的参数,比如GetRequest、MutateRequest等,具体参见Client.proto和HBase.proto文件中的相关定义;

调度执行

通信模块得到的call对象会交由rpcScheduler进行调度,目前默认实现为SimpleRpcScheduler;
rpcScheduler的主要作用是根据请求类型把请求分配给不同的rpcExecutor实例,请求类型有3种:普通请求、高优先级请求和replication请求,而rpcExecutor的实现目前主要由RWQueueRpcExecutor和FastPathBalancedQueueRpcExecutor两种,不同的类型使用了不同实现,关系如下:
rpcScheduler

RWQueueRpcExecutor的特点是内部可以对读写隔离,以及对get和scan隔离,所谓隔离的意思是,call对象会放入独立的callQueue,并使用独立的handler进行处理;

RWQueueRpcExecutor

FastPathBalancedQueueRpcExecutor不支持隔离,其特点是对于空闲的handler,让其自旋而不是阻塞,以减少线程上下文切换的消耗;

FastPathBalancedQueueRpcExecutor

服务实现

服务端实现类需要实现一些接口,例如AdminService.BlockingInterface、ClientService.BlockingInterface、MasterService.BlockingInterface等;

HMaster的服务实现类主要是MasterRpcServices,HRegionServer的服务实现类主要是RSRpcServices;

service相关的类会在启动阶段进行初始化,然后在请求处理时根据connection的serviceName获取到对应的service实例,再根据call对象的method和param进行方法的调用;

以HRegionServer为例,大概的service相关实例及调用关系如下:

rpc_

相关实践学习
lindorm多模间数据无缝流转
展现了Lindorm多模融合能力——用kafka API写入,无缝流转在各引擎内进行数据存储和计算的实验。
云数据库HBase版使用教程
  相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情: https://cn.aliyun.com/product/hbase   ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
6月前
|
分布式计算 资源调度 网络协议
分布式系统详解--框架(Hadoop--RPC协议)
分布式系统详解--框架(Hadoop--RPC协议)
52 0
|
7月前
|
分布式计算 分布式数据库 API
Spark与HBase的集成与数据访问
Spark与HBase的集成与数据访问
|
Kubernetes 流计算 容器
FLINK ON K8S 基于Zookeeper和基于K8S原生HA的区别
FLINK ON K8S 基于Zookeeper和基于K8S原生HA的区别
355 1
|
分布式计算 Java Hadoop
flink hadoop 从0~1分布式计算与大数据项目实战(4)zookeeper内部原理流程简介以及java curator client操作集群注册,读取
flink hadoop 从0~1分布式计算与大数据项目实战(4)zookeeper内部原理流程简介以及java curator client操作集群注册,读取
flink hadoop 从0~1分布式计算与大数据项目实战(4)zookeeper内部原理流程简介以及java curator client操作集群注册,读取
|
分布式计算 Hadoop 分布式数据库
HBASE 搭建方法
HBASE 搭建方法
139 0
|
存储 网络协议 API
【Flink】Flink 底层RPC框架分析
对于Flink中各个组件(JobMaster、TaskManager、Dispatcher等),其底层RPC框架基于Akka实现,本文着重分析Flink中的Rpc框架实现机制及梳理其通信流程。
450 0
【Flink】Flink 底层RPC框架分析
|
SQL 消息中间件 Kafka
Atlas集成外部组件—集成Hive、HBase、Kafka
Atlas集成外部组件—集成Hive、HBase、Kafka
628 0
Atlas集成外部组件—集成Hive、HBase、Kafka
|
Java 分布式数据库 调度
HBase rpc框架介绍
HBase的rpc框架有比较好的分层,便于在不同层次上进行实现优化和功能扩展。
1363 0
HBase rpc框架介绍
|
监控 分布式数据库 Python
云HBase Thrift使用最佳实践
  HBase原生只提供了JAVA API客户端,针对诸如python、php、c++等非java语言一般都是通过Thrift代理的方式访问HBase服务,本文从thrift架构、hbase thrift api使用以及如何监控thrift等几个方面详细介绍云HBase Thrift使用最佳实践;  Thrift是一种接口描述语言和二进制通讯协议,它被用来定义和创建跨语言的服务。
1947 0
|
大数据 调度 流计算
你有必要了解一下Flink底层RPC使用的框架和原理
5万人关注的大数据成神之路,不来了解一下吗?5万人关注的大数据成神之路,真的不来了解一下吗?5万人关注的大数据成神之路,确定真的不来了解一下吗? 欢迎您关注《大数据成神之路》 前言 对于Flink中各个组件(JobMaster、TaskManager、Dispatcher等),其底层RPC框架基于Akka实现,本文着重分析Flink中的Rpc框架实现机制及梳理其通信流程。
2203 0