HBase(五) HBase JAVA API - HTable、HTablePool与底层连接的共享

网友投稿 761 2022-05-29

单表交互的API,HBASE的CRUD操作都是使用这个类。继承自HTableInterface接口。

HTable实例的创建过程比较消耗资源,如每个实例都要扫描.META.表,以检查该表是否存在、是否可用,还有其他的一些操作,所以HTable实例不适合频繁的创建,要尽量复用。

HTable不是线程安全类,并发场景要注意隔离。如果是多线程场景,适合为每个线程分配一个HTable实例,或者使用HTablePool。

HTable的所有操作,都保证也只能保证行级别的原子性。

HTablePool是HTable的池化管理类,有几种构造函数,无参的构造函数默认会创建一个无限大的池,一般不建议这么用,使用需要指定最大实例数目的构造函数。还有自定义HTableInterfaceFactory的构造函数,使用这种构造函数可以自定义HTable的一些特殊的配置,比如一些初始化操作等。

使用getTable(String tableName)方法从池中取HTable实例,使用后调用putTable(HTableInterface table)方法放回。

有一点需要注意(个人认为也是hbase实现的问题),maxSize参数并不强行限制用户能得到的HTableInterface实例的上限,客户端能用getTable方法访问尽可能多的table实例。这个参数仅仅能设置池中能存放的HTableInterface实例的数目,比如maxSize=5,调用10次getTable会创建10个实例,后调用putTable,只有5次可以发挥作用,后面5次会被忽略,包括工厂的release机制也不会被触发,只是单纯的抛弃。

Configuration conf = HBaseConfiguration.create();

HTablePool pool = new HTablePool(conf, 5);

HTableInterface [] tables = new HTableInterface[10];

// 超出容量一样可以分配

for(int i=0;i<10;i++){

tables[i] = pool.getTable("t1");

System.out.println(Bytes.toString(tables[i].getTableName()));

}

for(int i=0;i<10;i++){

pool.putTable(tables[i]);

}

pool.closeTablePool("t1");

closeTablePool方法会遍历所有保存在列表中与参数对应的表的引用,使用工厂的release机制,会释放一张表的所有资源。所有的资源都要处理异常并释放,代码中使用过的表都要调用这个方法去释放资源

每个HTable实例底层都需要与服务器连接,连接是HConnection类表示的,并使用HConnectionManager类管理和共享。使用API时不需要直接实例化这两个类,只需要创建一个Configuration实例,然后隐式的使用连接。

HBase(五) HBase JAVA API - HTable、HTablePool与底层连接的共享

deleteConnection(org.apache.hadoop.conf.Configuration conf)

deleteAllConnections(boolean stopProxy)

转载请注明出处:华为云博客 https://portal.hwclouds.com/blogs

hbase

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:开源构建5G MEC生态之路
下一篇:fork、exec 和 exit 对 IPC 对象的影响
相关文章