初始化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方法就会