什么是获得HBase HTable句柄的最佳方法?

时间:2015-04-07 02:38:27

标签: apache hbase

一种方法是直接调用HTable构造函数,另一种方法是从HConnection调用getTable方法。第二个选项要求HConnection为“非托管”,这对我来说不是很好,因为我的进程将有许多线程访问HBase。我不想重新发明轮子来自己管理HConnections。

感谢您的帮助。

[更新]: 我们坚持使用0.98.6,因此ConnectionFactory不可用。

我发现bellow jira建议创建一个“非托管”连接并使用单个ExecuteService来创建HTable。为什么我们不能简单地使用非托管连接的getTable方法来获取HTable?那是因为HTable不是线程安全吗? https://issues.apache.org/jira/browse/HBASE-7463

1 个答案:

答案 0 :(得分:6)

我坚持使用旧版本(< 0.94.11),您仍然可以使用HTablePool,但由于HBASE-6580已弃用它,我认为从HTables到RS的请求现已自动汇总提供ExecutorService

ExecutorService executor = Executors.newFixedThreadPool(10);
Connection connection = ConnectionFactory.createConnection(conf, executor);
Table table = connection.getTable(TableName.valueOf("mytable"));
try {
    table.get(...);
    ...
} finally {
    table.close();
    connection.close();
}
  

我一直无法找到任何关于它的好示例/文档,因此请注意这是未经测试的代码,可能无法正常工作。

有关详细信息,您可以查看ConnectionFactory文档& JIRA问题: https://hbase.apache.org/apidocs/org/apache/hadoop/hbase/client/ConnectionFactory.html https://issues.apache.org/jira/browse/HBASE-6580

更新,因为您使用的是0.98.6并且ConnectionFactory不可用,您可以使用HConnectionManager:

HConnection connection = HConnectionManager.createConnection(config); // You can also provide an ExecutorService if you want to override the default one. HConnection is thread safe.
HTableInterface table = connection.getTable("table1");
try {
  // Use the table as needed, for a single operation and a single thread
} finally {
  table.close();
  connection.close();
}

HTable不是线程安全的,因此您必须确保始终使用HTableInterface table = connection.getTable("table1")获取新实例(它是一个轻量级的过程),然后使用table.close()关闭它。

流程将是:

    1. 开始您的流程
    1. 初始化您的HConnection
    1. 每个帖子:
  • 3.1从HConnection
  • 获取一个表
  • 3.2从表中写入/读取
  • 3.3关闭表格
    1. 流程结束时关闭HConnection

HConnectionManager:http://archive.cloudera.com/cdh5/cdh/5/hbase/apidocs/org/apache/hadoop/hbase/client/HConnectionManager.html#createConnection(org.apache.hadoop.conf.Configuration)

HTable:http://archive.cloudera.com/cdh5/cdh/5/hbase/apidocs/org/apache/hadoop/hbase/client/HTable.html