HBase RPC
简介
HBase主要包含Master,RegionServer,Client 3个组件组成。组件之间通过Rpc 和 zk进行通信。RPC通信功能主要基于Protobuf和NIO这两个组件来实现,
配置参数
hbase.ipc.server.listen.queue.size :
存放连接请求的等待队列长度,默认与ipc.server.listen.queue.size参数值相同,为128个。
hbase.regionserver.handler.count
regionserver 的 rpc请求队列处理线程数,默认为 30
hbase.master.handler.count
master rpc请求队列处理线程数,默认为 25
hbase.ipc.server.read.threadpool.size
Reader线程数,默认为10个。reader 的个数决定了从网络 io 里读取数据的速度也就是网络吞吐量
hbase.ipc.server.max.callqueue.size
单个消费队列所允许的存储空间上限(默认为1GB),超过该上限客户端会抛出以下异常
hbase.ipc.server.max.callqueue.length
单个消费队列的长度限制,默认值为10倍的Handler数。
hbase.ipc.server.callqueue.handler.factor
该参数用于决定消费队列的个数。
hbase.ipc.server.callqueue.read.share
|
|
结构
RPC报文
- 请求头
|
|
|
|
RPC实现
RpcServer配置三个队列:
- callQueue
绝大部分Call请求存在该队列中:callQueue上maxQueueLength为${ipc.server.max.callqueue.length},默认是${hbase.master.handler.count}*DEFAULT_MAX_CALLQUEUE_LENGTH_PER_HANDLER,目前0.95.1中,每个Handler上CallQueue的最大个数默认值(DEFAULT_MAX_CALLQUEUE_LENGTH_PER_HANDLER)为10。
- PriorityQueue
如果设置priorityHandlerCount的个数,会创建与callQueue相当容量的queue存储Call,该优先级队列对应的Handler的个数由rpcServer实例化时传入。
- replicationQueue
由于RpcServer由HMaster和RegionServer共用,该功能仅为RegionServer提供,queue的大小为${ipc.server.max.callqueue.size}指定,默认为102410241024,handler的个数为hbase.regionserver.replication.handler.count。
- rpc-client
- rpc-server
rpc-server基于nio 的reactor模型设计,其主要流程如下:
- scheduler
hbase rpc实现了两种调度器(FifoRpcScheduler和SimpleRpcScheduler)。FifoRpcScheduler是master默认的调度器,直接将CallRunner对象放到线程池中去执行。而SimpleRpcScheduler是RS默认调度器,分成三种不同的executor,对于不同的请求,使用的不同的executor去执行。