`
侯上校
  • 浏览: 217354 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

【转】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连接的,能够可以减少网络开销。

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);
}

 【转自】http://www.cnblogs.com/panfeng412/archive/2012/07/11/htable-and-htablepool-apply-notes.html

 

分享到:
评论

相关推荐

    hbase orm simplehbase v1.0

    simplehbase是java和hbase之间的轻量级中间件。 主要包含以下功能。 数据类型映射:java类型和hbase的bytes之间的数据转换。 简单操作封装:封装了hbase的put,get,scan等操作为简单的java...HTable count和sum功能。

    htable2csv:将HTML表转换为.csv文件

    htable2csv 将HTML表转换为.csv文件

    易语言判断系统补丁是否存在

    wmic qfe list full /format:htable。是直接转换为html网页的存在 然后可以调用写到本地。但是无法取出来作为判断 于是我想到用超文本浏览器取打开这个html 。去读取文字 然后使用正则表达式获取补丁版本都有那些...

    一个Demo即可入门指纹识别,全功能链的指纹识别matlab代码。

    3、在该代码的基础上进行更加深入的研究,实现前沿的处理、匹配和搜索算法。 4、入门的三角匹配算法,为指纹匹配(1:1)研究奠基 5、入门的指纹图像索引搜索算法,为指纹搜索(1:N)奠基 一个指纹的完整处理过程可以...

    易语言-易语言判断系统补丁是否存在

    wmic qfe list full /format:htable 是直接转换为html网页的存在 然后可以调用写到本地 但是无法取出来作为判断 于是我想到用超文本浏览器取打开这个html 去读取文字 然后使用正则表达式获取补丁版本都有那些 再去...

    storm-asynchbase:AsyncHBase 风暴映射器

    这个用于 Apache Storm 的连接器使用 AsyncHBase 客户端将原始数据和 Trident 状态保存到 Apache HBase。 好处 AyncHBase 客户端是 Apache HBase 的完全异步和线程安全的客户端。 与传统的 HBase 客户端 (HTable) ...

    IT赛道题库(1).zip

    HTable C. HBaseAdmin D. PutList Answer: C 2.在MapReduce的应用程序开发中,下列哪个JAVA类负责管理和运行一个计算任务? A. lob B. Context C. FileSystem D. Configuration Answer: A 3.Fusionlnsight HD中...

    kamcli:Kamailio命令行界面控制工具

    可以从终端一次运行,也可以通过嵌入式交互式shell(可以使用kamcli shell启动-参见相应部分)来一次运行。 使用kamcli的原型是: kamcli [options] command [arguments] 可以将用于kamcli的新命令实现为插件,每...

    云计算》教材配套课件9-HBase的原理与实验

    为什么需要HBase HTable的逻辑组织 HBase的运行机制 HBase与 HDFS HBase的对外接口

    高性能HBase客户端AsynchronousHBase.zip

    asynchbase...这个 HBase 客户端跟 HBase 的客户端 HTable 有着很大的区别,不需要重写所有的 HBase API 交互代码,原生异步,而且使用一些线程就可以跟 HBase 进行高效的交互。 标签:Asynchronous

    hbase各种例子新增修改删除批量导入

    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 ...

    HBase全局一致性事务支持Tephra.zip

    HBase 提供了强一致性的基于行和区域的 ACID 操作支持,但是牺牲了在跨区域操作的支持。这就要求应用开发者花很大力气来确保区域边界上操作的一致性。而 Tephra 提供了全局事务支持,可以夸区域、跨表以及多个 RPC ...

    treeTable - 创建具有可折叠行组的可排序表控件:创建具有可折叠/可扩展数据行组的基于 Java 的可排序树表 GUI 控件-matlab开发

    句法: htable = treeTable (pnContainer, headers, data, 'PropName',PropValue, ...) 输入参数: pnContainer - 容器 uipanel 或图形的可选句柄(默认值:gcf) headers - 列标题字符串的可选元胞数组数据-数据值...

    Apache HBase Primer

    网上的HBase书都比较老了,这是目前为止最新版本的HBase电子书。... Chapter 18: Using the HTable Class Part VI: Administration Chapter 19: Using the HBase Shell Chapter 20: Bulk Loading Data

    HBase-coprocessor

    端点协处理器:就像数据库的“存储过程”一样,这种类型的协处理器必须通过“ HTableInterface”(或HTable)的“ CoprocessorService()”方法显式触发。 协处理器不是为最终用户设计的,而是由开发人员使用的。 ...

    clojure-hbase-schemas:基于架构的HBase交互

    该库的灵感来自David Santiago的并直接从他的库中取消了对HTable管理功能的支持。 发行版保留在clojars中。 最新版本是: com.compasslabs/clojure-hbase-schemas "0.90.4"描述引入了两个主要功能:模式和约束。 ...

    判断系统补丁是否存在的-易语言

    wmic qfe list full /format:htable 是直接转换为html网页的存在然后可以调用写到本地 但是无法取出来作为判断 于是我想到用超文本浏览器取打开这个html 去读取文字 然后使用正则表达式获取补丁版本都有那些

    Hbase工具类

    文章目录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

Global site tag (gtag.js) - Google Analytics