hbase 线程处理

初始化HTable的时候会创建一个线程池(ThreadpoolExcutor)最大线程数为Int.maxValue ,ThreadPool中队列为异步队列SynchronousQueue  到此执行线程的架子搭好了、搭好架子之后就开始执行具体的任务啦。

执行的一个 callable  , 由于submit 提交callable的话是调用call方法,在call方法中初始化一个 ServerCallable  (继承自callable ),然后调用 withoutRetries  执行RPC操作,详细如下:

beforeCall :设置HbaseRpc的timeout  默认是 Int 最大值

connection:1、 获得regionLocation  2、获取server即 HRegionInterface  。 locateRegion就不讲了、就是通过zk获取region所在的RS。讲解RPC链接之前想将一下HbaseRpc



HbaseRpc  Rpc机制主要类, 主要有设置超时时间、获取RpcEngine, RpcEngine是一个接口、可以自定义实现RpcEngine,RpcEngine中主要方法包含:

getProxy:创建客户端代理

getServer: 获取一个RPCServer

call:远程调用

close :关闭实例

Hbase0.94 中 RpcEngine的实现是 WritableRpcEngine  ,在WritableRpcEngine   中会初始化HBaseClient ,HBaseClient是一个IPC(进程间通讯)服务客户端,初始化HbaseClient 主要是初始化一些IPC连接的参数,比如maxRetries 、 tcpNoDelay、tcpKeepAlive、socketfactory等信息。




HRegionInterface 作为客户端跟服务端交互的统一交互接口

如果想要对客户端的HRegionInterface 进行操作能让服务端执行就需要对 HRegionInterface 进行代理。也就是 HBaseRpc. waitForProxy() ----里面---> RpcEngine.getProxy()

在RpcEngine里面创建真正的代理如下: (T为实现protocol接口的实现类)

T proxy =
          (T) Proxy.newProxyInstance(
              protocol.getClassLoader(), new Class[] { protocol },
              new Invoker(client, protocol, addr, userProvider.getCurrent(), conf,
                  HBaseRPC.getRpcTimeout(rpcTimeout)));

上面代码主要意思就是将所有对 T的操作都需要交给 Invoker  的Invoker方法处理 ( Invoker 实现 InvocationHandler ),Invoker方法就会



你可能感兴趣的:(hbase 线程处理)