hbase 客户端HTablePool

本文探讨了HBase客户端的HTablePool实现,包括基于ThreadLocal和RoundRobin的池管理策略。由于HTable不是线程安全的,因此需要通过PoolMap将表名与HTable实例池映射,确保每个表有自己的池。当需要HTable实例时,从池中获取或创建,并在调用close时返回到池中。此外,文章提到了社区的改进方案,通过HConnectionManager获取Connection,所有HTable实例共享同一个ExecuteService池,提高了效率。
摘要由CSDN通过智能技术生成

1、首先定义一个池,重点: 定义一个什么资源(R)的池子, 池子应该有增删改查、大小等功能。

  protected interface Pool<R> {
    public R get();
    public R put(R resource);
    public boolean remove(R resource);
    public void clear();
    public Collection<R> values();
    public int size();
  }

2、定义完池子后、确定池子的类型,也即池的实现

  public enum PoolType {
    Reusable, ThreadLocal, RoundRobin;

池子的实现描述:  Reusable ,把资源放到一个LinkedList 中,使用的时候从List中移除、使用完后再放回

                                   ThreadLocal, 基于ThreadLocal 线程安全的线程池,用于多线程并发时

                                    RoundRobin ,基于copyonWriteArrayList (一个ArrayList线程安全的变体,适用于读多写少)的一个池,取一次然后+1接下来除size() 求余、然后再get


3、 池子中放什么、是不是需要MapPool(不同的key对应不同的池),接下来梳理一下hbase HTable的情况

首先HTable 不是线程安全的

我们要想对HTable操作就需要创建多个 HTable instance ,这样每次创建都是很费劲的、所以需要把HTable instance 放到池中,但是所有的实例都放到一起的话逻辑比较混乱,于是我们创建一个 PoolMap 把 表名与池映射起来,也就是说一个表有一个池。

当我们需要一个表的时候、我们就会根据表名上PoolMap中根据表名获取HTable instance ,如果没有获取到就创建一个、但是这里请注意,创建完成之后并如在池中,只有当调用close的时候才放回到池中。  close 时的流程是,检查该表有没有pool 没有的话创建一个,并把该表及对应的pool放到poolMap中。

附图:





针对上面的这种实现其实还是挺费劲的、所以后来社区有了一个新的解决方案、接下来对新方案进行讲解,参考:https://issues.apache.org/jira/browse/HBASE-6580


改变完了之后就是通过 HConnectionManager.getConnection获取Connection、同时ExcuteService池在connection中初始化 、然后通过Connection 获取 HTable ,并把pool传给HTable, 这样每一个HTable instance 提交请求之类的都是走同一个pool ,原先的话是每一个HTable instance都有一个 ExcuteService pool


前面已经说过了、所有HTable 共用一个Hconnection  和 config 为最佳方案,也是正确方案。下一篇开始讲Hconnection




                                    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值