连接HBase的正确姿势

转载 2018年04月17日 20:37:19

: 在云HBase值班的时候,经常会遇见有用户咨询诸如“HBase是否支持连接池?”这样的问题,也有用户因为应用中创建的Connection对象过多,触发了zookeeper的连接数限制,导致客户端连不上的。
在云HBase值班的时候,经常会遇见有用户咨询诸如“HBase是否支持连接池?”这样的问题,也有用户因为应用中创建的Connection对象过多,触发了zookeeper的连接数限制,导致客户端连不上的。究其原因,都是因为对HBase客户端的原理不了解造成的。本文简单介绍HBase客户端的Connection对象与socket连接的关系,并给出Connection的正确用法。

Connection是什么

在云HBase用户中,常见的使用Connection的错误方法有:
(1)自己实现一个Connection对象的资源池,每次使用都从资源池中取出一个Connection对象;
(2)每个线程一个Connection对象。
(3)每次访问HBase的时候临时创建一个Connection对象,使用完之后调用close关闭连接。
从这些做法来看,这些用户显然是把Connection对象当成了单机数据库里面的连接对象来用了。然而,作为一个分布式数据库,HBase客户端需要和多个服务器中的不同服务角色建立连接,所以HBase客户端中的Connection对象并不是简单对应一个socket连接。HBase的API文档当中对Connection的定义是:
A cluster connection encapsulating lower level individual connections to actual servers and a connection to zookeeper.
我们知道,HBase访问一条数据的过程中,需要连接三个不同的服务角色:
(1)Zookeeper
(2)HBase Master
(3)HBase RegionServer

而HBase客户端的Connection包含了对以上三种socket连接的封装。Connection对象和实际的socket连接之间的对应关系如下图:

在HBase客户端代码中,真正对应socket连接的是RpcConnection对象。HBase使用PoolMap这种数据结构来存储客户端到HBase服务器之间的连接。PoolMap封装了ConcurrentHashMap>的结构,key是ConnectionId(封装了服务器地址和用户ticket),value是一个RpcConnection对象的资源池。当HBase需要连接一个服务器时,首先会根据ConnectionId找到对应的连接池,然后从连接池中取出一个连接对象。
HBase中提供了三种资源池的实现,分别是Reusable,RoundRobin和ThreadLocal。具体实现可以通过hbase.client.ipc.pool.type配置项指定,默认为Reusable。连接池的大小也可以通过hbase.client.ipc.pool.size配置项指定,默认为1。

连接HBase的正确姿势


从以上分析不难得出,在HBase中Connection类已经实现了对连接的管理功能,所以我们不需要自己在Connection之上再做额外的管理。另外,Connection是线程安全的,而Table和Admin则不是线程安全的,因此正确的做法是一个进程共用一个Connection对象,而在不同的线程中使用单独的Table和Admin对象。

///所有进程共用一个connection对象
connection = ConnectionFactory.createConnection(config);
...
///每个线程使用单独的table对象
           Table table = connection.getTable(TableName.valueOf("test"));
           try {
                ...
           } finally {
               table.close();
           }

HBase客户端默认的是连接池大小是1,也就是每个RegionServer 1个连接。如果应用需要使用更大的连接池或指定其他的资源池类型,也可以通过修改配置实现:

config.set("hbase.client.ipc.pool.type",...);
config.set("hbase.client.ipc.pool.size",...);
connection = ConnectionFactory.createConnection(config);
...


跑步的正确姿势

跑步和走路其实都是自然而又复杂的动作,合理的跑姿多感受,多练习就能达到效果。教科书式的跑姿往往出于竞赛的目的,技术动作的发挥有赖于运动员的身体素质,因此,普通爱好者找到轻松、协调的跑姿就行。 跑步的...
  • firstchange
  • firstchange
  • 2016-08-15 23:19:01
  • 288

奋斗的正确姿势.mobi

  • 2017年10月30日 12:31
  • 4.3MB
  • 下载

论程序员成长的正确姿势

何为成长?成长是指自我提升,一方面是本身的个人能力,另一方面是社会对你的认可度。最终,程序员的职位和薪水都能在成长中得以体现。很多人对成长有误解,在他们眼中,随着工作年限的提高,成长是理所当然的事情,...
  • singwhatiwanna
  • singwhatiwanna
  • 2018-03-01 23:49:09
  • 3723

正确的关机姿势

原文链接:http://cn.linux.vbird.org/linux_basic/0160startlinux_5.php sync:将内存中的数据写入硬盘,防止不正常关机时内存中的数据丢失...
  • NotPassedCET4
  • NotPassedCET4
  • 2016-11-22 14:57:32
  • 146

Git远程操作的正确姿势

一直用的sourceTree软件图像化操作的git,但是觉得很多git远程操作命令还是很有必要的 Git有很多优势,其中之一就是远程操作非常简便。本文详细介绍5个Git命令,它们的概念和用法...
  • u011650048
  • u011650048
  • 2016-07-21 10:24:10
  • 377

谈谈学习 --- 我认为的正确的学习姿势

复制粘贴党与伸手党永远都不会成为大牛。
  • qq_31655965
  • qq_31655965
  • 2017-04-25 16:57:01
  • 2011

maven项目的一些姿势

maven项目会自动生成缓存,然后运行的其实都是缓存,在run as 中的 mavenclear 把缓存清理掉,  再通过maven install 来生成缓存,然后在tomcat中运行,就可以了。...
  • less_cold
  • less_cold
  • 2016-10-10 21:14:12
  • 314

这才是学习Linux的正确姿势

建议读者范围1、有开发经验者。 2、科研人员(由其Numrical)。 3、动手能力强的。 4、只是好奇,对于Linux只是浅尝辄止的就不建议继续往下看了。相关资料:史上最全的Linux资料包,...
  • dajiangtai007
  • dajiangtai007
  • 2017-04-13 11:11:47
  • 915

图带逛:以正确的姿势查看知乎图片

不骗你,真福利。
  • Ly4wU5giY
  • Ly4wU5giY
  • 2017-03-06 12:10:24
  • 135

椭圆机的正确姿势

个别肥友听别人说椭圆机可以减肥、瘦腿却又不伤膝盖,就找椭圆机天天去踩,不管三七二十一练了半个月发现体重还是老样子,小腿肚也酸酸胀胀一天天地壮硕起来,“跑步膝”非旦没有缓解反而越发酸痛,于是大呼专家都是...
  • newdanw
  • newdanw
  • 2016-12-19 16:10:27
  • 4768
收藏助手
不良信息举报
您举报文章:连接HBase的正确姿势
举报原因:
原因补充:

(最多只允许输入30个字)