HBase数据库中HTable和HTablePool使用注意事项

HTable和HTablePool都是HBase客户端API的一部分,可以使用它们对HBase表进行CRUD操作。下面结合在项目中的应用情况,对二者使用过程中的注意事项做一下概括总结。

HTable

HTable是HBase客户端与HBase服务端通讯的Java API对象,客户端可以通过HTable对象与服务端进行CRUD操作(增删改查)。它的创建很简单:

Configuration conf = HBaseConfiguration.create();
HTable table = new HTable(conf, "tablename");
//TODO CRUD Operation……

HTable使用时的一些注意事项:

1. 规避HTable对象的创建开销

因为客户端创建HTable对象后,需要进行一系列的操作:检查.META.表确认指定名称的HBase表是否存在,表是否有效等等,整个时间开销比较重,可能会耗时几秒钟之长,因此最好在程序启动时一次性创建完成需要的HTable对象,如果使用Java API,一般来说是在构造函数中进行创建,程序启动后直接重用。

2. HTable对象不是线程安全的

HTable对象对于客户端读写数据来说不是线程安全的,因此多线程时,要为每个线程单独创建复用一个HTable对象,不同对象间不要共享HTable对象使用,特别是在客户端auto flash被置为false时,由于存在本地write buffer,可能导致数据不一致。

3. HTable对象之间共享Configuration

HTable对象共享Configuration对象,这样的好处在于:

共享ZooKeeper的连接:每个客户端需要与ZooKeeper建立连接,查询用户的table regions位置,这些信息可以在连接建立后缓存起来共享使用;

共享公共的资源:客户端需要通过ZooKeeper查找-ROOT-和.META.表,这个需要网络传输开销,客户端缓存这些公共资源后能够减少后续的网络传输开销,加快查找过程速度。

因此,与以下这种方式相比:

HTable table1 = new HTable("table1");

HTable table2 = new HTable("table2");

下面的方式更有效些:

Configuration conf = HBaseConfiguration.create();

HTable table1 = new HTable(conf, "table1");

HTable table2 = new HTable(conf, "table2");

备注:即使是高负载的多线程程序,也并没有发现因为共享Configuration而导致的性能问题;如果你的实际情况中不是如此,那么可以尝试不共享Configuration。

HTablePool

HTablePool可以解决HTable存在的线程不安全问题,同时通过维护固定数量的HTable对象,能够在程序运行期间复用这些HTable资源对象。

Configuration conf = HBaseConfiguration.create();

HTablePool pool = new HTablePool(conf, 10);

1. HTablePool可以自动创建HTable对象,而且对客户端来说使用上是完全透明的,可以避免多线程间数据并发修改问题。

2. HTablePool中的HTable对象之间是公用Configuration连接的,能够可以减少网络开销。

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/database/extra/

HTablePool的使用很简单:每次进行操作前,通过HTablePool的getTable方法取得一个HTable对象,然后进行put/get/scan/delete等操作,最后通过HTablePool的putTable方法将HTable对象放回到HTablePool中。

下面是个使用HTablePool的简单例子:

public void createUser(String username, String firstName, String lastName, String email, String password, String roles) throws IOException {
  HTable table = rm.getTable(UserTable.NAME);
  Put put = new Put(Bytes.toBytes(username));
  put.add(UserTable.DATA_FAMILY, UserTable.FIRSTNAME,
  Bytes.toBytes(firstName));
  put.add(UserTable.DATA_FAMILY, UserTable.LASTNAME,
    Bytes.toBytes(lastName));
  put.add(UserTable.DATA_FAMILY, UserTable.EMAIL, Bytes.toBytes(email));
  put.add(UserTable.DATA_FAMILY, UserTable.CREDENTIALS,
    Bytes.toBytes(password));
  put.add(UserTable.DATA_FAMILY, UserTable.ROLES, Bytes.toBytes(roles));
  table.put(put);
  table.flushCommits();
  rm.putTable(table);
}

至于多线程使用HTablePool的真实性能情况,需要通过实际的测试工作得到。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索客户端
, 对象
, 多线程
, zookeeper
, java hbase
, configuration
tobytes
hbase 注意事项、数据库设计注意事项、数据库迁移注意事项、数据库备份注意事项、数据库学习注意事项,以便于您获取更多的相关知识。

时间: 2024-10-01 18:41:18

HBase数据库中HTable和HTablePool使用注意事项的相关文章

Java在HBase数据库中创建一个数据表的实例

要通过Java在HBase中创建一个数据表,首先需要导入hbase-client.jar驱动包.可以在项目pom.xml配置文件中添加依赖: <dependency>     <groupId>org.apache.hbase</groupId>     <artifactId>hbase-client<artifactId>     <version>1.1.0.1</version><dependency>

复制数据库中需要注意的几点事项

任务简介: 此次复制的生产库数文件为9.18TB,实际分配的数据大小为5.16TB,使用RMAN压缩备份后为1.1TB. 复制端数据库采用单实例ASM存储方式管理,数据库版本为11.2.0.4. 数据文件目录为+DATA,14.5TB,归档日志目录为+ARCH,2TB. 生产库数据文件大小SQL> select sum(bytes)/1024/1024/1024 GB from dba_segments;         GB----------5287.02454 生产库实际分配的大小SQL>

shell 命令行中操作HBase数据库实例详解_Linux

 shell 命令行中操作HBase数据库 Shell控制 进入到shell命令行界面,执行hbase命令,并附加shell关键字:  [grid@hdnode3 ~]$ hbase shell HBase Shell; enter ¨help¨ for list of supported commands. Type "exit" to leave the HBase Shell Version 0.90.5, r1212209, Fri Dec 9 05:40:36 UTC 201

HBase数据库性能优化总结笔记

垃圾回收优化 master基本不会遇到垃圾回收的问题.由于memstore的刷写机制是不连续的,所以java虚拟机的堆内存会出现孔洞.快速刷写到磁盘的数据会被划分到新生代,这种空间会被优先回收数据停留的时间太长,会被划分到老生代甚至终生代.而且老生代和终生代一般占据了好几个G,而新生代一般就几百M而已 新生代空间由此得出新生代的空间一般的分配如下     -XX:MaxNewSize=128m -XX:NewSize=128m   可以缩写为     -Xmn128m   设定好之后观察是否合理

跟我一起云计算(3) hbase数据库

hbase HBase是一个分布式的.面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文"Bigtable:一个结构化数据的分布式存储系统".就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力.HBase是Apache的Hadoop 项目的子项目.HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库.另一个不同的是HBase基于

关系型数据库中的关键技术

存储引擎 MySQL 的存储引擎可能是所有关系型数据库产品中最具有特色的了,不仅可以同时使用多种存储引擎,而且每种存储引擎和MySQL之间使用插件方式这种非常松的耦合关系. 由于各存储引擎功能特性差异较大,这篇文章主要是介绍如何来选择合适的存储引擎来应对不同的业务场景. MyISAM 1.特性 不支持事务:MyISAM存储引擎不支持事务,所以对事务有要求的业务场景不能使用 表级锁定:其锁定机制是表级索引,这虽然可以让锁定的实现成本很小但是也同时大大降低了其并发性能 读写互相阻塞:不仅会在写入的时

《R语言数据分析》——1.4 从数据库中导入数据

1.4 从数据库中导入数据 使用一个专用的数据库测试平台比根据需要从磁盘中导入文件效率要高很多,这是由数据库本身特性决定的: 对大数据表的访问速度更快 在数据导入R前,提供了更快更有效的数据聚集和筛选方法 相比电子表格以及R对象实现的传统矩阵模型,能够提供更加结构化的关系 数据模型来存储数据 提供对数据的连接及合并操作 在同一时间支持对多个客户端的并发远程访问 提供了安全和有限的访问 提供可扩展及可配置的数据存储后台 DBI包提供了数据库操作的接口,可以作为R和不同关系数据管理系统(Relati

hbase-如何将mysql数据库中的数据存到hadoop上

问题描述 如何将mysql数据库中的数据存到hadoop上 求助如何将mysql数据库中的数据存到hadoop上,又如何进行查询? 解决方案 http://www.2cto.com/database/201412/359232.html 解决方案二: http://www.iteye.com/news/27625 解决方案三: 可以使用Kettle Spoon对数据进行抽取和转移,是图形化界面,可以支持几乎所有的数据库,包括关系型数据库Oracle.MySQL和非关系型数据库HBase等,也支持

hbase scan中匪夷所思的SingleColumnValueFilter和COLUMNS

假设关系型数据库中存在如下表(test_row_key) ------------------------------------------ TIME_ID    AREA_ID       INDEX1 ..........................................  201206        730    201206730  201206        731    201206731  201207        730    201207730  201207