`
helpbs
  • 浏览: 1210857 次
文章分类
社区版块
存档分类
最新评论

HTablePool的实现分析

 
阅读更多

1)基本概念

HTablePool

  • ​3种类型
    • ​PoolType.Reusable(默认)一个实例池,多线程复用,内部是每个table一个ConcurrentLinkedQueue装多个实例
    • PoolType.ThreadLocal,很奇怪的实现,每个线程只能有一个实例,感觉在多线程的场景没有意义
    • PoolType.RoundRobin​(没有被使用,就算设置了该类型也没用,见HTablePool的构造函数)
  • PoolMap<String, HTableInterface> tables​:用于存放table实例,正如上面提到的默认是每个table对应一个ConcurrentLinkedQueue​
  • maxSize:pool的最大尺寸​

2)样例代码

  • 使用多线程访问HTablePool


3)关键点分析

3.1)初始化

HTablePool pool = new HTablePool(conf, 5);

  • 实例化PoolMap
  • ​实例化HTablePool,此时还没有任何HTable实例​,tables为空

3.2)获取table实例

pool.getTable(TEST_TABLE_NAME);​

  • 查看tables是否含有table,如果没有,创建一个HTable实例,HTable的初始化具体的细节见我的博文http://blog.csdn.net/pwlazy/article/details/7417135
  • 将返回HTable实例封装成PooledHTable实例返回
  • PooledHTable是​HTable的一个Wrapper,除了close()不一样,​PooledHTable的close会将​HTable实例返回到上面提到的tables中
  • 所以tables确实存放的是HTable实例,但取出来丢给应用程序的就是PooledHTable实例

3.3)table.get(get);

3.4)table.close();

  • 将table归还到​HTablePool中,如果此时​HTablePool尺寸超过最大尺寸,释放该实例​,
  • 关于释放HTable实例与释放连接的问题
    • HTable实例相关的两个连接,一个是对zookeeper,一个是regionServer
    • 如果没有其他HTable实例​(在HTablePool尺寸大于0的情况不可能出现这种情况),及没有zookeeper的连接计数为0,此时才会释放zookeeper连接
    • ​regionServer的连接有HBaseClient$Connection这个线程单独维护,与HTable实例基本没啥关系,注意HBaseClient$Connection这个线程绑定了连接
4)总体看HTablePool

  • ​容纳了多个HTable实例
  • 多个HTable实例会共享同一个zookeeper连接
  • 多个HTable实例,如果同在一个RegionServer会共享同一个连接HBaseClient$Connection
  • 很容易让人误解每个HTable实例都有一个HBaseClient$Connection,就像连接池那样,其实不是
  • 虽然HTablePool有最大尺寸,但并没有限制HTable实例不得大于这个尺寸,一旦超过这个尺寸就会实例化,但归还到实例池的时候,如果池满了会弃用,因此​HTablePool就是一个对象池而不是连接池
  • 使用HTablePool的意义?《HBase-The-Definitive-Guide​》 作者是这么说的
    • ​实例化HTable实例比较耗时,最好启动时初始化(这个理由不是很充分,完全可以使用HTable单例)
    • HTable实例线程不安全,特别是在auto flash为false的情况,因为存在本地的write buffer ,即使​auto flash为true,也不建议使用(对此作者并没说为什么​)
    • 建议每个线程一个HTable实例
  • HTablePool存在的问题​​​​​
    • ​PooledHTable的代码很恶心,PooledHTable作为一个HTable的wrapper,两者的关系应该是包含,但源码中却是继承
    • ​HTablePool并不是连接池,就是直接使用​HBaseClient$Connection【如果是同一个region的话就是单线程】来完成网络通讯的,后者的问题在​我的博文http://blog.csdn.net/pwlazy/article/details/7417135有提到, 的确存在多个线程使用​单个HBaseClient$Connection而带来同步和阻塞的问题,线上使用必须好好的压力测试一下

分享到:
评论
1 楼 greatwqs 2013-06-26  
想问一下楼主的HBase版本是多少呢?

我这边用的是hbase-0.92.1-cdh4.1.3, 源码解释与你说的一致.这个版本的Pool还不错.

相关推荐

    hbase分页查询实现.pdf

    HBase分页查询实现 HBase作为一个NoSQL数据库,具有高性能、...本文讲解了如何使用Java语言实现HBase的分页查询,并介绍了HBase的配置、HTablePool、获取HBase表、字节数组的转换、Filter和ResultScanner等知识点。

    hbase分页查询实现

    hbase分页查询实现 HBase是一种基于Hadoop的分布式数据库,具有高性能、可扩展性和高可用性等特点。然而,HBase本身并不支持分页查询,这给开发者带来了许多不便。因此,实现HBase的分页查询功能是非常必要的。 ...

    hbase分页查询实现[归类].pdf

    HBase分页查询实现 HBase是一种基于分布式的NoSQL数据库,它提供了高效的数据存储和检索能力。然而,HBase本身不支持分页查询,这使得开发者需要自己实现分页功能。本文将讲解如何使用Java语言实现HBase的分页查询...

    Java代码通过API操作HBase的最佳实践.pdf

    为了实现高效和可靠的HBase操作,这里介绍一些最佳实践。 首先,避免直接使用`HTable`实例化。通常,开发人员可能会直接通过`new HTable(config, tablename)`创建`HTable`对象,但这不是推荐的方式,因为它涉及到了...

    hbase orm simplehbase v1.0

    9. **HTablePool管理**:通过HTablePool管理HBase的连接池,提高了并发性能并减少了资源消耗。 10. **HTable计数和求和功能**:提供了计算表中行数和对数据进行求和的功能,方便进行数据分析。 示例代码展示了如何...

    Java操作Hbase进行建表、删表以及对数据进行增删改查

    import org.apache.hadoop.hbase.client.HTablePool; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.client.ResultScanner; import ...

    simpleHbase1.0

    8. **HTablePool管理**:通过管理HTable实例池,SimpleHbase优化了资源利用,避免了频繁创建和销毁HTable对象导致的性能开销。 9. **计数与求和功能**:提供了计算指定表行数和求和的便捷方法,对于数据分析和报表...

    hadoop 分布式云计算 课程设计报告

    `HBcon`类是HBase连接的实现,它使用`HBaseConfiguration.create()`创建配置对象,然后设置Zookeeper的相关参数,如`hbase.zookeeper.quorum`和`hbase.zookeeper.property.clientPort`。`HTablePool`用于管理HTable...

    多线程 hbase

    2. **HBase客户端API**:HBase提供了Java客户端API,支持线程安全的`HTablePool`,这个池可以管理多个`HTable`实例,每个实例对应一个HBase表,允许多线程共享和复用这些实例,减少创建和销毁HTable对象的开销。...

    java链接及操作hbase实例代码

    这些都涉及到HBase的高级特性,例如使用`HTablePool`管理表对象池,或者使用`BulkLoadHFile`工具进行数据导入优化。同时,HBase的Region分布、表分区策略、以及Compaction和Flush机制也是理解HBase性能调优的重要...

    Hbase 基本操作类

    Hbase 基本操作类 static { ... tablePool = new HTablePool(conf, poolsize); logger.debug("create hbase connection success"); // System.out.println("create hbase connection success"); }

    HBase核心知识点总结

    之后,使用HTablePool创建表,通过`put`方法添加数据,`get`方法读取数据,`delete`方法删除数据,而`increment`方法用于更新列值。HBase的写操作会先写入预写式日志(HLog)和MemStore,确保数据持久化。读操作则...

    hbase java api 访问 增加修改删除(一)

    在本文中,我们将深入探讨如何使用HBase的Java API进行数据的增加、修改和删除操作。HBase是一个基于Google Bigtable...在实际项目中,还可以考虑使用HBase的客户端库如HBaseAdmin和HTablePool,以简化管理和并发操作。

Global site tag (gtag.js) - Google Analytics