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对象的效率。

//这是我对外提供服务的类
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

Java代码通过API操作HBase的最佳实践的更多相关文章

  1. HBase 6、用Phoenix Java api操作HBase

    开发环境准备:eclipse3.5.jdk1.7.window8.hadoop2.2.0.hbase0.98.0.2.phoenix4.3.0 1.从集群拷贝以下文件:core-site.xml.hb ...

  2. jsp页面:js方法里嵌套java代码(是操作数据库的),如果这个js 方法没被调用,当jsp页面被解析的时候,不管这个js方法有没有被调用这段java代码都会被执行?

    jsp页面:js方法里嵌套java代码(是操作数据库的),如果这个js 方法没被调用,当jsp页面被解析的时候,不管这个js方法有没有被调用这段java代码都会被执行? 因为在解析时最新解析的就是JA ...

  3. 《深入理解Java虚拟机:JVM高级特性与最佳实践》【PDF】下载

    <深入理解Java虚拟机:JVM高级特性与最佳实践>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062566 内容简介 作为一位 ...

  4. .NET API 接口数据传输加密最佳实践

    .NET API 接口数据传输加密最佳实践 我们在做 Api 接口时,相信一定会有接触到要给传输的请求 body 的内容进行加密传输.其目的就是为了防止一些敏感的内容直接被 UI 层查看或篡改. 其实 ...

  5. 读书笔记-《深入理解Java虚拟机:JVM高级特性与最佳实践》

    目录 概述 第一章: 走进Java 第二章: Java内存区域与内存溢出异常 第三章: 垃圾收集器与内存分配策略 第四章: 虚拟机性能监控与故障处理 第五章: 调优案例分析与实战 第六章: 类文件结构 ...

  6. restful api的10个最佳实践

    Web API在过去的几年里非常盛行,因为它有着语法简单.规范化和轻量级的优点,因为得到广泛的推崇,很多过往的技术手段都慢慢转换为使用Web API来开发.而Web API通常使用的设计方式是REST ...

  7. Java API 操作HBase Shell

    HBase Shell API 操作 创建工程 本实验的环境实在ubuntu18.04下完成,首先在改虚拟机中安装开发工具eclipse. 然后创建Java项目名字叫hbase-test 配置运行环境 ...

  8. linux 下通过过 hbase 的Java api 操作hbase

    hbase版本:0.98.5 hadoop版本:1.2.1 使用自带的zk 本文的内容是在集群中创建java项目调用api来操作hbase,主要涉及对hbase的创建表格,删除表格,插入数据,删除数据 ...

  9. 大数据技术之_11_HBase学习_02_HBase API 操作 + HBase 与 Hive 集成 + HBase 优化

    第6章 HBase API 操作6.1 环境准备6.2 HBase API6.2.1 判断表是否存在6.2.2 抽取获取 Configuration.Connection.Admin 对象的方法以及关 ...

随机推荐

  1. QT 截取屏幕的实现

    QPixmap提供了两个函数 grabWidget 和 grabWindow 可以将屏幕上的窗体存成一个 QPixmap 格式的图片,很容易再将 QPixmap 存成文件.函数使用很简单,两行代码就可 ...

  2. jquery append()方法与html()方法使用方法差别

    append(content):方法在被选元素的结尾(仍然在内部)插入指定内容,有非常多朋友认为append与html差点儿相同.其他从英文意义上append是在原有基础上添加,而html中是替换当前 ...

  3. 索引快速扫描(index fast full scan)

    一.索引快速扫描(index fast full scan) 索引快速全扫描(INDEX FAST FULL SCAN)和索引全扫描(INDEX  FULL SCAN)极为类似,它也适用于所有类型的B ...

  4. jqPlot图表插件学习之折线图-散点图-series属性

    一.准备工作 首先我们需要到官网下载所需的文件: 官网下载(笔者选择的是jquery.jqplot.1.0.8r1250.zip这个版本) 然后读者需要根据自己的情况新建一个项目并且按照如下的方式加载 ...

  5. SUMIF

    SUMIF(range,criteria,sum_range) Range:条件区域,用于条件判断的单元格区域. Criteria:求和条件,由数字.逻辑表达式等组成的判定条件.criteria 参数 ...

  6. python模块之imghdr(识别不同格式的图片文件)

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python模块之imghdr(识别不同格式的图片文件) import imghdr '''>> ...

  7. java第九节 网络编程的基础知识

    /** * * 网络编程的基础知识 * 网络协议与TCP/IP * IP地址和Port(端口号) * 本地回路的IP地址:127.0.0.1 * 端口号的范围为0-65535之间,0-1023之间的端 ...

  8. NTP国内时钟服务器

    阿里云linux时钟服务器 ntp1.aliyun.comntp2.aliyun.comntp3.aliyun.comntp4.aliyun.comntp5.aliyun.comntp6.aliyun ...

  9. CSS3 flex的使用方法

    display:flex; align-items://水平对齐方式 justify-content://垂直对齐方式 flex://盒子所占大小(如果你盒子里面只有两个div,那么你设置其中之一个f ...

  10. Dubbo创建提供者&消费者工程

    1. 前言 Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载.如果不想使 ...