一种方法是直接调用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
答案 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()
关闭它。
流程将是:
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