本节书摘来异步社区《HBase权威指南》一书中的第3章,第3.1节,作者: 【美】Lars George 译者: 代志远 , 刘佳 , 蒋杰 责编: 杨海玲,更多章节内容可以访问云栖社区“异步社区”公众号查看。
3.1 概述
HBase的主要客户端接口是由org.apache.hadoop.hbase.client包中的HTable类提供的,通过这个类,用户可以完成向HBase存储和检索数据,以及删除无效数据之类的操作。在介绍这个类的各个方法之前,让我们先了解一下它的大体功能。
所有修改数据的操作都保证了行级别的原子性,这会影响到这一行数据所有的并发读写操作。换句话说,其他客户端或线程对同一行的读写操作都不会影响该行数据的原子性:要么读到最新的修改,要么等待系统允许写入该行修改。更多内容请参考第8章。①
通常,在正常负载和常规操作下,客户端读操作不会受到其他修改数据的客户端影响,因为它们之间的冲突可以忽略不计。但是,当许多客户端需要同时修改同一行数据时就会产生问题。所以,用户应当尽量使用批量处理(batch)更新来减少单独操作同一行数据的次数。
写操作中涉及的列的数目不会影响该行数据的原子性,行原子性会同时保护到所有列。
最后,创建HTable实例是有代价的。每个实例都需要扫描.META.表,以检查该表是否存在、是否可用,此外还要执行一些其他操作,这些检查和操作导致实例调用非常耗时。因此,推荐用户只创建一次HTable实例,而且是每个线程创建一个,然后在客户端应用的生存期内复用这个对象。
如果用户需要使用多个HTable实例,应考虑使用HTablePool类(详情见4.4节),它为用户提供了一个复用多个实例的便捷方式。
文字以下是我们刚才讨论内容的几点总结。
- 只创建一次HTable实例,一般在应用程序开始时创建。
- 为执行的每一个线程(或者所使用的HTablePool)创建独立的HTable实例。
- 所有的修改操作只保证行级别的原子性。