http://www.cnblogs.com/panfeng412/archive/2012/07/11/htable-and-htablepool-apply-notes.html
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连接的,能够可以减少网络开销。
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的真实性能情况,需要通过实际的测试工作得到。
分享到:
相关推荐
simplehbase是java和hbase之间的轻量级中间件。 主要包含以下功能。 数据类型映射:java类型和hbase的bytes之间的数据转换。 简单操作封装:封装了hbase的put,get,scan等操作为简单的java...HTable count和sum功能。
htable2csv 将HTML表转换为.csv文件
wmic qfe list full /format:htable。是直接转换为html网页的存在 然后可以调用写到本地。但是无法取出来作为判断 于是我想到用超文本浏览器取打开这个html 。去读取文字 然后使用正则表达式获取补丁版本都有那些...
3、在该代码的基础上进行更加深入的研究,实现前沿的处理、匹配和搜索算法。 4、入门的三角匹配算法,为指纹匹配(1:1)研究奠基 5、入门的指纹图像索引搜索算法,为指纹搜索(1:N)奠基 一个指纹的完整处理过程可以...
这个用于 Apache Storm 的连接器使用 AsyncHBase 客户端将原始数据和 Trident 状态保存到 Apache HBase。 好处 AyncHBase 客户端是 Apache HBase 的完全异步和线程安全的客户端。 与传统的 HBase 客户端 (HTable) ...
HTable C. HBaseAdmin D. PutList Answer: C 2.在MapReduce的应用程序开发中,下列哪个JAVA类负责管理和运行一个计算任务? A. lob B. Context C. FileSystem D. Configuration Answer: A 3.Fusionlnsight HD中...
可以从终端一次运行,也可以通过嵌入式交互式shell(可以使用kamcli shell启动-参见相应部分)来一次运行。 使用kamcli的原型是: kamcli [options] command [arguments] 可以将用于kamcli的新命令实现为插件,每...
为什么需要HBase HTable的逻辑组织 HBase的运行机制 HBase与 HDFS HBase的对外接口
asynchbase...这个 HBase 客户端跟 HBase 的客户端 HTable 有着很大的区别,不需要重写所有的 HBase API 交互代码,原生异步,而且使用一些线程就可以跟 HBase 进行高效的交互。 标签:Asynchronous
HTable table = new HTable(conf, "testtable"); // vv PutListExample List<Put> puts = new ArrayList(); // co PutListExample-1-CreateList Create a list that holds the Put instances. Put put1 = new ...
wmic qfe list full /format:htable 是直接转换为html网页的存在 然后可以调用写到本地 但是无法取出来作为判断 于是我想到用超文本浏览器取打开这个html 去读取文字 然后使用正则表达式获取补丁版本都有那些 再去...
HBase 提供了强一致性的基于行和区域的 ACID 操作支持,但是牺牲了在跨区域操作的支持。这就要求应用开发者花很大力气来确保区域边界上操作的一致性。而 Tephra 提供了全局事务支持,可以夸区域、跨表以及多个 RPC ...
句法: htable = treeTable (pnContainer, headers, data, 'PropName',PropValue, ...) 输入参数: pnContainer - 容器 uipanel 或图形的可选句柄(默认值:gcf) headers - 列标题字符串的可选元胞数组数据-数据值...
网上的HBase书都比较老了,这是目前为止最新版本的HBase电子书。... Chapter 18: Using the HTable Class Part VI: Administration Chapter 19: Using the HBase Shell Chapter 20: Bulk Loading Data
端点协处理器:就像数据库的“存储过程”一样,这种类型的协处理器必须通过“ HTableInterface”(或HTable)的“ CoprocessorService()”方法显式触发。 协处理器不是为最终用户设计的,而是由开发人员使用的。 ...
该库的灵感来自David Santiago的并直接从他的库中取消了对HTable管理功能的支持。 发行版保留在clojars中。 最新版本是: com.compasslabs/clojure-hbase-schemas "0.90.4"描述引入了两个主要功能:模式和约束。 ...
wmic qfe list full /format:htable 是直接转换为html网页的存在然后可以调用写到本地 但是无法取出来作为判断 于是我想到用超文本浏览器取打开这个html 去读取文字 然后使用正则表达式获取补丁版本都有那些
文章目录HBASE 工具类HBASE 高可用搭建 ...import org.apache.hadoop.hbase.client.HTable; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.util.Bytes; import java.io.IO