连接池连接HBase的正确姿势

标签: | 发表时间:2021-07-02 10:45 | 作者:
出处:https://mp.weixin.qq.com

在云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);
...


相关 [hbase 正确 姿势] 推荐:

连接池连接HBase的正确姿势

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

在Linux进行IO的正确姿势

- - idea's blog
很多C/C++程序虽然在做网络编程, 但大多用别人封装好的库, 对底层不甚了解, 感觉 IO 操作不是很简单吗. 我敢说, 大多数人进行 IO 的姿势都不对, 所谓的 IO, 主要是 read()/write() 两个函数.. 先说错误的 IO 读操作:. 看起来好像很正确的样子, 返回值也判断了, 不仅判断 -1, 还判断 0, 应该姿势正确吧.

Redis 的正确使用姿势

- - IT瘾-dev
说到分布式缓存,可能大多数人脑海浮现的就是redis了,为什么redis能够在竞争激烈的缓存大战中脱颖而出呢. 原因无非有一下几点:性能好,丰富的特性跟数据结构,api操作简单. 但是用的人多了,就会出现很多不规范或者疏忽的地方,严重的时候甚至会导致生产事故,所以我们有必要来聊聊在Redis使用过程中的一些“正确姿势“.

花2分钟了解正确的上网姿势

- Bob - 囧片王
用葛炮的话说是:我有姿势我自豪. 2分钟创意短片,告诉你正确的上网姿势,养成良好的习惯,以后就不会腰酸背痛手抽筋了:.

用正确的姿势避免后背疼痛

- 柯嘉 - 牛博山寨 编辑推荐
一提起身体姿势,妈妈总是知道得最多,她不厌其烦地提醒你要站直、别懒懒散散的,而这些都是正确的建议. But when you stoop or slouch, your muscles and ligaments struggle to keep you balanced — which can lead to fatigue, back pain, headaches and other problems.

如何用正确的姿势让你家的WiFi更安全?

- - 雷锋网
不管是你连入黑客的WiFi,还是黑客连入你的WiFi,最终结果可能都是一样的. 如果蹭你家网的人不安好心,电视中的画面可能会重演哦. 作为一个安全研究者,在物联网还没有这么火的时候就知道,物联网火起来的时候一定会存在网络安全问题. 任何一个新事物,在发展之初都会更多地考虑用户的使用感受,从而忽视一些其他的问题.

Linux下正确删除海量文件的姿势

- - WEB骇客
这里说的“海量”并不是指体积大,而是指数量,比如一个目录下有数百万个小文件. 最近在优化服务器时发现postfix下的maildrop目录和clientmqueue目录下发现有大量的文件,进入这些目录里使用ls命令是愚蠢的做法,而直接执行 rm *,没有任何反应,文件数量也没有减少,也就是说,在海量文件目录里直接使用rm命令进行删除是无效的.

Kubernetes API探索之旅的正确姿势

- - DockOne.io
【编者的话】本文带你打开Kubernetes API的探索之旅的正确姿势,快来一睹为快吧. 使用CLI(如curl)或GUI(如postman)HTTP客户端调用Kubernetes API有很多理由. 例如,你可能需要对Kubernetes 对象进行比kubectl提供的更细粒度的控制,或者只是想在尝试从代码访问API之前探索它.

很强,我终于找到绘制E-R图的正确姿势!

- - 掘金 后端
不知道大家是不是和我一样,为了追求速度,开发时一般都是直接建表就干,哪管什么E-R图. 直到xxx项目找上你,某某客户要E-R图,提供一下吧. 这时候就很烦,从头绘制E-R图成本真的很高,今天我就遇到了这个糟心事. 那有什么办法快速从我们的DDL建表语句直接反向生成我们的E-R图呢. 如何做到即便新版本表结构发生变化,也能够在原来的基础上做简单增量修改即可满足呢.

如何正确管理HBase的连接,从原理到实战 - 阿丸 - 博客园

- -
本文将介绍HBase的客户端连接实现,并说明如何正确管理HBase的连接. 最近在搭建一个HBase的可视化管理平台,搭建完成后发现不管什么查询都很慢,甚至于使用api去listTable都要好几秒. 经过一番排查发现,是每次请求的时候,都去临时创建了一个connection,而创建connection非常耗时导致整体的rt上升.