hbase之RPC详解

本文详细介绍了HBase的RPC机制,包括HBaseRPC、RpcEngine、HBaseClient、HBaseServer和VersionedProtocol五个关键组件。HBaseClient通过RPC与HBaseServer通信,实现客户端对HMaster和HRegionServer的访问。RPC调用过程涉及到socket连接、代理对象的创建和缓存、线程池管理以及超时和重试策略。HBase的连接管理包括HConnection、HBaseClient.Connection和HBaseServer.Connection,它们在客户端与服务器之间建立了高效的通信链路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HbaseRPC主要由HBaseRPCRpcEngineHBaseClientHBaseServerVersionedProtocol 5个概念组成。

1HBaseRPChbase RPC的实现类,核心方法:

1)、RpcEngine getProtocolEngine():返回RpcEngine对象

2)、<T extends VersionedProtocol> T waitForProxy():调用RpcEnginegetProxy()方法,返回一个远程代理对象,比如:第一次访问HRegionServer时需要执行该方法,设置代理后,会缓存该对象到HConnectionImplementation中。

 

 

2RpcEngine接口,其实现类:WritableRpcEngine,核心方法:

1)、VersionedProtocol getProxy():返回代理对象,HRegionServerHMaster均是VersionedProtocol的实现类,即返回的对象可代理执行HRegionServerHMaster的方法;

2)、Object[] call():调用程序接口,最终是经过HBaseClient的内部类Connection通过socket方式完成;

       3)、RpcServer getServer():返回RpcServer的实现类,有一个抽象实现: HBaseServerHBaseServer的子类:WritableRpcEngine.Server

4)、stopProxy()

 

 

3HBaseClientRPCclient端实现,最核心的方法是call(),通过该方法可执行服务端的方法,该类中有一个重要的内部类:HBaseClient.Connection,该类封装了socket,具体原理就是把要执行的方法通过socket告诉服务端,服务端通过HBaseServer类从socket中读出client端的调用方法,然后执行相关类的相应方法,结果再通过socket传回。

 

 

4HBaseServerRPCserver端实现,HBaseServer有两个重要的内部类,一个是HBaseServer.Connection,另一个是Handler类,这里的Connectionsocket中读出call方法并放入callQueue队列中,Handler类从该队列中取出call方法(比如:scan查询时执行的一次next(),该方法会执行到服务端HRegionServernext(),这里next就是call方法)并执行,结果通过socket输出给client端,HandlerThread的子类,在RS启动时就会创建所有的Handle线程,然后一直执行,具体的handler线程数可以通过配置项hbase.regionserver.handler.count配置,默认是10

 

 

5VersionedProtocol,该接口的类图如下:



 

 

可进行RPC调用的类必须是该接口的实现类,hbase client、 RS、Master相互之间的访问总结为:

  • HBase Client 通过HMasterInterface接口访问HMasterServer,通过HRegionInterface接口访问HRegionServer;
  • HRegionServer通过HMasterRegionInterface接口访问HMasterServer;
  • HMaster通过HRegionInterface接口访问HRegionServer,在访问RS时Master就是HBase Client的角色。

scan查询为例画时序图,通过时序图详细理解HBaseRPC调用过程



 

 

 

关于HBaseRPC一些知识补充如下:

1HBaseClient缓存了HBaseClient.Connection,默认一个client应用与每个RS均只有一个socket链接,可以通过以下两个配置项修改:

1)hbase.client.ipc.pool.type:默认为RoundRobin,共三种,如下:

// PoolMap类的createPool方法,在HBaseClient缓存connection时会调用,从pool中获取connection时,如果缓存的数量没有达到poolMaxSize,则会返回null,从而创建新的connection对象

protected Pool<V> createPool() {

    switch (poolType) {

    case Reusable: return new ReusablePool<V>(poolMaxSize); //复用的池

    case RoundRobin: return new RoundRobinPool<V>(poolMaxSize); //轮询

    case ThreadLocal:  return new ThreadLocalPool<V>(); //本地线程

    }

    return null;

  }

//PoolMap.RoundRobinPool类的get方法,缓存的数量没有达到poolMaxSize,则会返回null,这时会创建新的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值