Java代码通过API操作HBase的最佳实践
2014-04-16 17:25
639 查看
HBase提供了丰富的API。这使得用Java连接HBase非常方便。
有时候大家会使用HTable table=new HTable(config,tablename);的方式来实例化一个HTable对象,实际上这并不是最好的实例化HTable的办法。最好的办法是使用HTablePool,并且每个线程都使用独立的HTable(参见《HBase The Definitive Guide》 4.4 HtablePool 和3.1 客户端API 概述)。因为HTable实例的创建非常耗时,需要扫描.META表确认表是否存在,是否可用等,还需要做其他的一些操作,所以,最好在系统启动的时候创建实例,如果需要多个HTable,考虑使用HTablePool。
比如我在webservice中,需要对HTable进行查询,并将数据返回,我是这么做的:
可以在提供服务的类的构造函数里完成HTablePool的初始化,弃用下面的方法。
先在静态代码块中把系统中需要用到的表都获取一遍,获取完之后立即关闭该表,以期增加真正的服务的代码中,第一次实例化HTable对象的效率。
在真正的服务的代码中,直接使用pool.getTable(tableName)即可快速实例化该表。如下所示:
本文已同步至大数据技术( http://cloudera.org.cn ),文章地址:http://cloudera.org.cn/?p=43
有时候大家会使用HTable table=new HTable(config,tablename);的方式来实例化一个HTable对象,实际上这并不是最好的实例化HTable的办法。最好的办法是使用HTablePool,并且每个线程都使用独立的HTable(参见《HBase The Definitive Guide》 4.4 HtablePool 和3.1 客户端API 概述)。因为HTable实例的创建非常耗时,需要扫描.META表确认表是否存在,是否可用等,还需要做其他的一些操作,所以,最好在系统启动的时候创建实例,如果需要多个HTable,考虑使用HTablePool。
比如我在webservice中,需要对HTable进行查询,并将数据返回,我是这么做的:
可以在提供服务的类的构造函数里完成HTablePool的初始化,弃用下面的方法。
先在静态代码块中把系统中需要用到的表都获取一遍,获取完之后立即关闭该表,以期增加真正的服务的代码中,第一次实例化HTable对象的效率。
//这是我对外提供服务的类 public class HBaseQu { // SignHBase.getConfiguration()是从配置文件中获取 //org.apache.hadoop.conf.Configuration的一个对象 // 定义一个全局的HTablePool public static HTablePool hTablePool = new HTablePool( SignHBase.getConfiguration(), Integer.MAX_VALUE); // 初始化所用到的HTablePool,从pool中get一个需要用到的表,get完毕,立即关闭, // 以后每增加一个接口,如果需要用到一个新表的话,就在此处增加一次获取表,然后关闭它的代码。 static {
HTable table = null;
//从池里获取一个表,然后关闭它(类似于充血) try {
table = (HTable) hTablePool.getTable(tableName);
if (null != table) { table.close(); } } catch (IOException e) { e.printStackTrace(); } //获取另外一个表 try {
table = (HTable) hTablePool.getTable(tableName2);
if (null != table) { table.close(); } } catch (IOException e) { e.printStackTrace(); } } }
在真正的服务的代码中,直接使用pool.getTable(tableName)即可快速实例化该表。如下所示:
HTable table = null;//定义HTable ResultScanner rs = null;//定义接收结果的ResultScanner对象 try { //实例化HTable对象 table = (HTable) HBaseQu.hTablePool.getTable(tablename); Scan s = new Scan();//实例化Scan对象 s.setFilter(new PrefixFilter(rowPrifix.getBytes()));//添加过滤器 s.addColumn(Bytes.toBytes(family), Bytes.toBytes(qualifier)); rs = table.getScanner(s);//获取结果 for (Result r : rs) {//循环处理行 KeyValue[] kv = r.raw(); for (int i = 0; i < kv.length; i++) { value.add(new String(kv[i].getRow(), "UTF-8") + ":---:" + new String(kv[i].getFamily()) + ":" + new String(kv[i].getQualifier()) + ":---:" + new String(kv[i].getValue())); } } } catch (Exception e) { e.printStackTrace(); return null; } finally { //关闭打开的资源 if (null != rs) { rs.close(); } try { if (null != table) { table.close(); } } catch (IOException e) { e.printStackTrace(); } }
本文已同步至大数据技术( http://cloudera.org.cn ),文章地址:http://cloudera.org.cn/?p=43
相关文章推荐
- linux 下通过过 hbase 的Java api 操作hbase
- hbase命令实践与java api代码实践
- hbase命令实践与java api代码实践
- 在集群中Java 通过调用API操作HBase 0.98
- paip.复制文件 文件操作 api的设计uapi java python php 最佳实践
- paip.复制文件 文件操作 api的设计uapi java python php 最佳实践
- hbase编程:通过Java api操作hbase
- 在集群中java 通过调用API操作HBase 0.98
- HBase基本API(java)操作(增删改查)
- Hbase的java_API操作
- HBase 6、用Phoenix Java api操作HBase
- 【十八掌●武功篇】第八掌:HBase之基本操作Java API
- 利用javaApI【eclipse】操作HBase时,出现异常的解决方案
- Zoookeeper_Java API操作zookeeper 通过zookeeper.jar
- hbase Java Api 操作
- 基于Elasticsearch2.1.1的JavaAPI基本操作代码示例
- 在Eclipse中运行JAVA代码远程操作HBase的示例
- Java代码分析器(二)- 使用DOM API操作抽象语法树
- 通过java调用SVN API 实现代码的checkout update commit
- hbase快速入门-- java api 操作