HBaseServer:
一个请求发送的数据是:数据的长度(int类型,不包括本身) + call id(int类型) + call的内容
(1)Listener 监听连接请求,来了新的Connection,按照round robin方式选择一个Reader,由这个Reader来读取解析这个Connection上面的call。
Reader 数量由ipc.server.read.threadpool.size来配置(默认10)。
Reader 发现某个Connection上面可读,就读取该连接上面的数据,一个一个call的数据读取出来。每当读取到一个call的数据后会解析出来,放到相应的CallQueue。
在解析call之前有个检查操作:如果当前call的大小+callQueueSize > maxQueueSize的话,会拒绝该call,返回callTooBig,让Client过会重试。Server端积累了比较多的请求还未处理,Server的一种自我保护。
解析出来call之后,callQueueSize增加相应的值,然后判断call应该放到那个队列,在put到相应的队列。put的时候可能会阻塞,因为这个队列是LinkedBlockingQueue,这个队列最大的容量是
this.conf.getInt("ipc.server.max.callqueue.length", handlerCount * DEFAULT_MAX_CALLQUEUE_LENGTH_PER_HANDLER);
(2)Handler 从相应的callQueue里面take call出来并进行处理
有几种Handler,并且可以设置不同的数量。priorityHandler、handler、ReplicationHandler
处理完了后,返回结果包装成 HbaseObjectWritable (WritableRpcEngine.Server.call),即使返回结果是null 也会返回一个Response
处理完的call Handler会把它放到responseQueue里面。在放到responseQueue之前会检查responseQueuesSize,如果超过一定的值就会block
放到responseQueue去了之后,会判断下当前responseQueue里面call的数量,如果只有一个那么把这个call的response发送到client端去,最多发送NIO_BUFFER_LIMIT这么多数据,如果结果超过了这个值,那么剩余的结果由Responder线程去发送
如果当前responseQueue的数量超过1,那么Handler就不管了,直接返回,该call完全处理完了。
(3)Responder 处理responseQueue里面的call,把response发送到client端。
responseQueue 各个Connection 是分开的。
可以监控Connection 的数量,各个Connection上面有多少未处理完的call,responseQueue 有多大。
facebook的版本:
(1)Reader 数 默认是 cpu 数+1
(2)Reader 线程并不解析call,它读取到一个call请求后,封装成RawCall,放入callQueue队列。
(3)Handler 线程从callQueue里面take一个RawCall,第一步就是parse(解析)出来call。
call的decode操作从Reader线程移到了Handler线程。
facebook的版本把call的decode操作从Reader线程移到Handler线程来做比较容易,是因为只有一种Handler,只有一个callQueue
http://gee.cs.oswego.edu/dl/cpjslides/nio.pdf
Optimize the HBaseServer to deserialize the data for each ipc connection in parallel
https://issues.apache.org/jira/browse/HBASE-6103
port HADOOP-6713 - threading scalability for RPC reads - to HBase
https://issues.apache.org/jira/browse/HBASE-2941
Do no unregister and re-register interest ops in RPC
https://issues.apache.org/jira/browse/HBASE-6619
这3个issue社区版本都是已经解决了的
分享到:
相关推荐
- **Client**: 使用HBase RPC机制与HMaster和HRegionServer通信。 - **HMaster**: 负责整个集群的管理和协调工作,包括Region分配、负载均衡等。 - **HRegionServer**: 负责处理客户端的数据读写请求,每个Region ...
这个框架由多个组件构成,包括RPCServer和RPCClient,它们是HBase内部类,负责处理客户端请求并转发给相应的服务器。RPC.Server是Hadoop中的基础RPC服务实现,而HBase在其基础上进行了定制,以满足其特定需求,如...
RPCServer是基于LINC开发的一款Spark SQL服务器,它允许用户通过RPC(远程过程调用)接口与Spark SQL引擎进行交互,实现数据查询和处理。在本文中,我们将深入探讨RPCServer的基本概念、工作原理以及如何配置和使用...
4. RPC机制:理解HBase如何通过HBaseRpcController和RpcServer实现客户端与服务器之间的通信。 5. 并发控制:学习RegionSplitPolicy、RegionSplitter等类,理解HBase如何处理并发请求和Region分裂。 6. 客户端API:...
除了`hbase-client.jar`,可能还包含其他相关的JAR包,如`hbase-common.jar`,它包含了HBase的通用工具和模块,`hbase-server.jar`包含RegionServer所需的服务端代码,以及`hbase-protocol.jar`包含客户端和服务器...
6. **HBase Protocol**: 定义了HBase的RPC协议,包括各种服务的定义和消息类型。通过分析源码,可以了解到HBase如何进行远程调用和数据序列化。 7. **HBase Prefix Tree**: 这是一个优化HBase查询性能的模块,利用...
- RPC的瓶颈和优化:原有RpcServer的线程模型效率较低,通过使用Netty来优化HBaseRpcServer,大幅度减少了响应时间,并提升了吞吐能力。 - 异步与吞吐:针对流式计算的实时性要求,HBase通过实现non-blocking客户端...
* RPC 的瓶颈和优化:使用 Netty 实现 HBase RpcServer,提高 RPC 的吞吐能力 * 异步与吞吐:使用 non-blocking client 和 protobuf 的 non-blocking Stub/RpcCallback 实现 callback 回调,提高异步处理和吞吐能力 ...
4. **RPC通信**:`org.apache.hadoop.hbase.ipc`包下的RpcServer实现了客户端与服务器之间的远程过程调用,处理客户端请求。 5. **版本控制与并发控制**:每个Cell都有时间戳,用于版本控制;`org.apache.hadoop....
6. Region服务器(Region Server):HBase将表分成多个Region,每个Region由一个Region服务器管理。Region服务器负责处理与Region相关的所有读写操作。 7. ZooKeeper:ZooKeeper是一个分布式协调服务,用于管理...
3. **hbase-protocol**: 定义了HBase的RPC协议,用于客户端和服务器之间的通信。 4. **hbase-server**: 包含了HBase服务器端的组件,虽然在客户端不直接使用,但在构建完整的HBase环境时是必需的。 5. **zookeeper...
- **创建RPC Server**:接着创建一个RPC Server,并启动它。 - **监听客户端请求**:启动一个监听线程,用于监听客户端的请求,并将这些请求放入NIO请求队列中。 - 创建多个Selector(由`ipc.server.read....
- **hbase-protocol.jar**:提供了HBase的RPC协议,客户端和服务端通信需要。 - **zookeeper.jar**:HBase依赖Zookeeper进行集群协调,所以需要Zookeeper的JAR。 - **slf4j-api.jar**和**slf4j-log4j12.jar**:...
`hbase-protocol-1.2.6.jar`定义了HBase的RPC协议,用于客户端与服务器之间的通信。 为了处理Zookeeper,你需要`zookeeper-3.4.6.jar`,这是一个分布式协调服务,HBase使用它来管理集群的状态信息和元数据。`...
0.99.2版本的`HBaseRpcController`和`RpcServer`实现了异步调用和请求调度,极大地提升了系统吞吐量。同时,HBase还支持多种数据压缩算法,如Snappy和LZO,通过`Compression`模块的源码,可以了解其压缩和解压缩的...
4. `hbase-protocol-*.jar`:定义了HBase的RPC协议,用于客户端和服务器之间的通信。 5. `zookeeper-*.jar`:HBase依赖ZooKeeper进行协调和服务发现,所以也需要包含ZooKeeper的jar包。 在实际项目中,你可能还会...
此外,由于Coprocessor运行在HBase的Region Server上,因此它可以充分利用计算本地性,进行高效的数据聚合和计算。 Coprocessor 使用场景: 1. Observer:Observer是运行在Region Server上的,它监听并响应HBase的...
原有基于阻塞I/O的RpcServer线程模型效率不高,阿里技术团队通过引入Netty框架来高效复用线程,实现了HBaseRpcServer。优化后,平均响应时间从0.92ms降低到了0.25ms,吞吐能力提升接近两倍。在异步与吞吐优化中,...
其中,RPC client 负责与 Region Server 的通信,AsyncTable 是一个异步的表操作接口,Async Client 是一个异步的客户端实现。 异步 HBase 客户端的优点是提高了系统的性能和可用性,减少了阻塞式客户端带来的性能...