hbase与客户端的通信过程解析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hbase与客户端的通信过程解析相关的知识,希望对你有一定的参考价值。

参考技术A hbase通信主要涵盖了两个技术,一个是 google的protobuf rpc通信框架 ,一个是 java的NIO通信 ;

org.apache.hadoop.hbase.regionserver.HRegionServer这个类是regionserver的启动类;
org.apache.hadoop.hbase.master.HMaster这个类是Hmaster的启动类,继承了HRegionServer;
而HRegionServer定义了一个org.apache.hadoop.hbase.regionserver.RSRpcServices变量:

因此整个通信过程最核心的就是这两个类:RSRpcServices和RpcServer

hbase的protobuf的使用流程如下:

此过程主要是以下要讨论的 JAVA NIO做的工作;

Message callBlockingMethod(MethodDescriptor var1, RpcController var2, Message var3) throws ServiceException;

关于 java NIO的使用,主要集中于RpcServer类中:
主要使用了一个listener,但是实际情况这不是一个常见的listener模式,而是用来监听请求的监听器。

而它的实现如下:

主要定义了一个acceptChannel,一个selector和多个readers,每个reader对应一个selector;

它的主线程是监控selector中的accept请求,进行doAccept操作:

主要是对每个accept请求创建了一个connection对象,每个connection对应一个读写数据的channel,然后注册channel给某一个reader的selector;

对于每个reader线程来说,会对自己selector绑定的所有的SelectionKey进行查看,如果接收到数据,那么对绑定的connection进行处理,最后调用connection的process方法;
解析收到的请求,然后创建请求;通过scheduler执行,

scheduler是整个regionserver处理所有请求的核心,创建scheduler需要用到参数如下,因此hbase.regionserver.handler.count参数决定了同时进行处理请求的handler个数,即regionserver的并发能力。

最后再rpcserver中调用call函数:
Message result = service.callBlockingMethod(md, controller, param);

上边写到数据的具体执行在CallRunner中,执行结束后调用Call.setResponse方法,

其中通过IPCUtil.getDelimitedMessageAsByteBuffer(result)把messgae数据序列化成buffer,调用google提供的com.google.protobuf.CodedOutputStream实现的序列化方法。

以下是reponder提供的方法:

最后将数据写进属于自己的channel中。

以上是关于hbase与客户端的通信过程解析的主要内容,如果未能解决你的问题,请参考以下文章

HBase赠书 | HBase客户端避坑指南

HBase 客户端避坑指南

html5的websocket和php的socket分别完成客户端与服务器端的通信过程。

TCP协议的客户端与服务器的通信过程

Nodejs 实现服务端与客户端简单通信

Nodejs 实现服务端与客户端简单通信