`

HTable和HTablePool使用注意事项

 
阅读更多

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

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


复制代码

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

分享到:
评论

相关推荐

    HBASE使用注意事项

    ### HBASE使用注意事项详解 #### 一、表设计注意事项 **1.... - **背景**:HBase依赖于...此外,对于Java API的使用也需要注意资源管理和HTable实例的有效管理。遵循这些原则将有助于提高HBase系统的稳定性和性能。

    Java代码通过API操作HBase的最佳实践.pdf

    1. 使用`HTablePool`管理`HTable`实例,以提高性能和减少资源消耗。 2. 在服务初始化时预获取并关闭`HTable`,确保后续操作的高效性。 3. 使用`Scan`对象进行精细化的查询控制,包括设置过滤器和指定查询列。 4. 在...

    hadoop 分布式云计算 课程设计报告

    5. HBase的连接池管理和HTable的使用。 6. HBase中Scan类的运用,用于数据的扫描和查询。 这样的课程设计有助于学生理解Hadoop生态系统的实际应用,以及如何在实际项目中结合不同的数据库技术进行数据管理。同时,...

    eclipse构建HBase开发环境并运行实例对Hbase建表增删改查

    2. 增操作:使用HTable类可以实现增操作。首先需要创建一个HTable对象,然后使用Put对象将数据写入到HBase中。 ```java public static void put(String tablename, String row, String columnFamily, String column,...

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

    在IT行业中,数据的处理和转换是常见的任务之一。标题提到的"htable2csv"工具,就是这样一个专门用于将HTML表格转换成CSV(Comma ...通过学习和使用这类工具,我们可以更好地驾驭数据,提升数据驱动决策的能力。

    多线程 hbase

    2. **HBase客户端API**:HBase提供了Java客户端API,支持线程安全的`HTablePool`,这个池可以管理多个`HTable`实例,每个实例对应一个HBase表,允许多线程共享和复用这些实例,减少创建和销毁HTable对象的开销。...

    hadoop和hbase集成所需jar包

    - `HTable` 和 `Put`/`Get`:在Mapper和Reducer中,使用`HTable`实例来与HBase表交互,`Put`用于写入数据,`Get`用于读取数据。 5. **注意事项**: - 需要确保Hadoop和HBase版本兼容,避免因版本不匹配导致的问题...

    Java操作Hbase进行建表、删表以及对数据进行增删改查

    使用 HTable 对象进行增删改查操作: ```java HTable table = new HTable(configuration, "wuji"); Put put = new Put("rowkey"); put.add("cf", "qualifier", "value"); table.put(put); Get get = new Get(...

    hbase orm simplehbase v1.0

    10. **HTable计数和求和功能**:提供了计算表中行数和对数据进行求和的功能,方便进行数据分析。 示例代码展示了如何使用SimpleHbaseClient进行操作。例如,创建一个SimpleHbaseClient实例,然后插入、查找、范围...

    HBaseClientDemo

    3. `HTable`: 表示与HBase表的连接,通过`HTable.getTableName()`获取表名,`HTable.getTableDescriptor()`获取表的描述符,`HTable.put()`和`HTable.get()`分别用于写入和读取数据。 4. `Put` 和 `Get`: 这两个类...

    Hbase调用JavaAPI实现批量导入操作.docx

    Hbase 调用 JavaAPI 实现批量导入操作 在大数据时代,Hbase 作为一个分布式、面向列的 NoSQL 数据库,...使用 JavaAPI 调用 Hbase 实现批量导入操作可以提高数据处理效率和存储能力,满足大规模数据存储和处理的需求。

    hbase访问方式之javaapi共3页.pdf.zip

    对于并发控制,可以使用HTable的`checkAndPut()`和`checkAndDelete()`方法。 九、优化与性能 优化HBase Java API的使用,可以考虑以下几点:批量操作、使用BufferedMutator、调整缓存设置、选择合适的分区策略等。 ...

    Hbase调用JavaAPI实现批量导入操作

    批量导入通常使用`HTable`的`put`方法或者`batch`方法。`put`方法用于插入单条记录,而`batch`方法则可以处理多条记录,提高了效率。批量操作将所有待写入的数据先放入内存,然后一次性提交到HBase,减少了网络传输...

    初始化pinpoint库

    6. `README.md`:这是一个Markdown格式的文档,通常包含关于这些脚本的使用说明、目的或注意事项。 在初始化Pinpoint库时,首先需要安装和配置HBase环境。这包括设置HBase的配置文件(如hbase-site.xml),配置...

    Mapinfo常用函数及用法

    本篇文章将详细探讨MapInfo中的一些常见函数及其用法,这对于MapInfo的开发和高级使用至关重要。 1. **SelectByExpression()**: 这个函数用于根据指定的表达式选择表中的记录。例如,`SelectByExpression("AREA >...

    HBASE性能调优方法1

    通过`HTable.setWriteBufferSize(writeBufferSize)`设置写缓冲区大小,可根据实际需求调整,以平衡写入速度和内存使用。当写缓冲区满时,数据会被刷新到RegionServer。 3. WAL日志(Write Ahead Log): 在HBase中,...

    Hadoop+HBase+Java API

    然后,开发者可以创建一个MapReduce作业,定义Mapper和Reducer类,使用`FileInputFormat`和`FileOutputFormat`指定输入和输出格式。在Mapper中,数据被转换并发送到Reducer,Reducer则对数据进行聚合或转换。对于...

    hbase资料api

    HBase数据查询API HBase是一种分布式的、面向列的NoSQL数据库,主要应用于存储大量的半结构化数据。HBase提供了多种查询方式,包括单...这些示例代码展示了如何使用Get和Scan对象来查询数据,包括单条查询和批量查询。

    Hbase几种入库方式

    Hbase 入库方式比较 ...预先生成 HFile 入库适合大规模数据集,通过 MapReduce 入库适合需要批量处理数据的场景,使用 HTable.put() 方法入库适合小规模数据集,多线程入库适合需要高效写入的场景。

    java连接hbase的jar包

    4. **执行操作**: 使用`HTable`对象进行增删查改操作,如`put()`、`get()`、`scan()`和`delete()`。 5. **关闭资源**: 操作完成后,记得关闭表和连接以释放资源。 ```java table.close(); connection.close(); ```...

Global site tag (gtag.js) - Google Analytics