分享

HBase 0.94以后版本为什么把HTablePool给Deprecated

a568277043 发表于 2014-8-27 16:45:49 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 6 19166
HBase 0.94以后版本为什么把HTablePool给Deprecated

已有(6)人评论

跳转到指定楼层
howtodown 发表于 2014-8-27 17:12:37
官方给出的答案如下:

HTablePool是HBase连接池的老用法,该类在0.94,0.95和0.96中已经不建议使用,在0.98.1版本以后已经移除。


可能原因是:
HTable实例并不是线程安全的。


详细信息可以查看:
HBase连接池 -- HTablePool被Deprecated,使用HConnectionManager

回复

使用道具 举报

a568277043 发表于 2014-8-27 17:20:22
本帖最后由 a568277043 于 2014-8-27 17:35 编辑

这篇文章也看过,只是分析了源码。但是有了连接池不是比HConnectionManager的gettable()获得htable更方便管理连接,就像数据库那样的连接池
回复

使用道具 举报

sstutu 发表于 2014-8-27 18:22:20
a568277043 发表于 2014-8-27 17:20
这篇文章也看过,只是分析了源码。但是有了连接池不是比HConnectionManager的gettable()获得htable更方便管 ...
你的理解可能有些偏差,是类被弃用,连接池并没有消失。

回复

使用道具 举报

pig2 发表于 2014-8-28 00:44:52
本帖最后由 pig2 于 2014-8-28 00:50 编辑
下面可参考:​


关于释放HTable实例与释放连接的问题
HTable实例相关的两个连接,一个是对zookeeper,一个是regionServer
如果没有其他HTable实例​(在HTablePool尺寸大于0的情况不可能出现这种情况),及没有zookeeper的连接计数为0,此时才会释放zookeeper连接
​regionServer的连接有HBaseClient$Connection这个线程单独维护,与HTable实例基本没啥关系,注意HBaseClient$Connection这个线程绑定了连接
总体看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的话就是单线程】来完成网络通讯的,后在多个线程使用​单个HBaseClient$Connection而带来同步和阻塞的问题

回复

使用道具 举报

a568277043 发表于 2014-8-28 08:34:34
HBaseClient$Connection在源码中怎么找不到相应的类
回复

使用道具 举报

howtodown 发表于 2014-8-30 13:14:49
a568277043 发表于 2014-8-28 08:34
HBaseClient$Connection在源码中怎么找不到相应的类
这个是hbase的connection
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条