HBase 相关API操练(二):Java API
一、HBase Java编程
(1)HBase是用Java语言编写的,它支持Java编程;
(2)HBase支持CRUD操作:Create,Read,Update和Delete;
(3)Java API包含HBase Shell支持的所有功能,甚至更多;
(4)Java API是访问HBase最快的一种方式。
二、HBase Java编程——程序设计步骤
第一步:创建一个Configuration对象
Configuration conf = HBaseConfiguration.create();
1)Configuration对象包含各种配置信息
第二步:构建一个HTable句柄
HTable table = new HTable(conf, tableName);
1)提供Configuration对象;
2)提供待访问Table的名称。
第三步:执行操作
table.getTableName();
1)执行put、get、delete、scan等操作
第四步:关闭HTable句柄
table.close();
1)将内存数据刷新到磁盘上去
2)释放各种资源
三、HBase交互
与 HBase 集群进行交互,有很多种不同的方式可以选择,如 Java API、REST、Thrift 等。下面我们以Java API为例介绍它们的用法。
Java API 交互
HBase、 与 Hadoop 一样,都是用 java 编写的,所以 HBase 对 java 支持是必需的,下面看看怎么使用java 语言对 HBase 进行操作。Java API 核心类介绍如下。
1、 HBaseConfiguration 类
HBaseConfiguration 是每一个 HBase Client 都会使用到的对象,它代表 HBase 配置信息。有两种构造方式。
public HBaseConfiguration()
public HBaseConfiguration(final Configuration c)
默认构造方式会尝试从 hbase-default.xml 和 HBase-site.xml 文件中读取配置。如果CLASSPATH 没有这两个文件,就需要自己配置。
Configuration HBASE_CONFIG = new Configuration();
HBASE_CONFIG.set("hbase.ZooKeeper.quorum","zkServer"); //hbase 服务地址
HBASE_CONFIG.set("hbase.ZooKeeper.property.clientPort",""); //端口号
HBaseConfiguration cfg = new HBaseConfiguration(HBASE_CONFIG); //读取配置文件
2、 创建表
创建表通过 HBaseAdmin 对象操作。HBaseAdmin 负责META 表信息的处理。HBaseAdmin 提供了 createTable 方法。
public void createTable(HTableDescriptor desc)
HTableDescriptor 表示表的 Schema,提供常用方法有以下两个。
1)setMaxFileSize:指定最大 Region 的大小。
2)setMemStoreFlushSize:指定 MemStore Flush 到 HDFS 上的文件大小。
3、 增加 Family
使用 addFamily 方法实现 Family 的添加。
public void addFamily(final HColumnDescriptor family)
HColumnDescriptor 代表 Column 的 Schema,提供的常用方法有以下几个。
1、setTimeToLive:指定最大的 TTL(单位是 ms),过期数据会被自动删除。
2、setInMemory:指定是否放在内存中,对小表有用,可用于提高效率。默认关闭。
3、setBloomFilter:指定是否使用 BloomFilter,可提高随机查询效率。默认关闭。
4、setCompressionType:设定数据压缩类型。默认无压缩。
5、setMaxVersions:指定数据最大保存的版本个数。默认为3。
举个简单的例子,创建 4 个 Family 表,命令如下。
HBaseAdmin hAdmin = new HBaseAdmin(hbaseConfig);
HTableDescriptor table = new HTableDescriptor(tableName);
table.addFamily(new HColumnDescriptor("f1"));
table.addFamily(new HColumnDescriptor("f2"));
table.addFamily(new HColumnDescriptor("f3"));
table.addFamily(new HColumnDescriptor("f4"));
hAdmin.createTable(table);
4、 删除表
删除表也是通过 HBaseAdmin 来操作,删除表之前首先要 disable 表。这是一个非常耗时的操作,所以不建议频繁删除表。
disableTable 和 deleteTable 分别用来执行 disable 和 delete 操作。使用方法如下。
HBaseAdmin hAdmin = new HBaseAdmin(hbaseConfig);
if(hAdmin.tableExists(tableName)){
hAdmin.disableTable(tableName);
hAdmin.deleteTable(tableName);
}
5、查询数据
查询分为单条随机查询和批量查询。单条查询通过 Row Key 在Table 中查询某一行的数据,HTable 提供了get 方法完成单条查询。批量查询通过制定一段 Row Key 的范围来查询,HTable 提供了 getScanner 方法完成批量查询。
public Result get(final Get get)
public ResultScanner getScanner(final Scan scan)
Get 对象包含一个 Get 查询需要的信息,它的构造方法有两种。
public Get(byte [] row)
public Get(byte [] row,RowLock rowLock)
Row Lock 为了保证读写的原子性,可以传递一个已经存在 Row Lock,否则 HBase 会自动生成一个新的 Row Lock。
Scan 对象提供了默认构造函数,一般使用默认构造函数
1) Get 和 Scan 的常用方法有以下几个。
addFamily/addColumn:指定需要的 Family 或者 Column,如果没有调用任何 Family 或者 Column,会返回所有的 Column。
setMaxVersions:指定最大的版本个数。如果不带任何参数调用 setMaxVersions,表示取所有的版本。如果不调用 setMaxVersions,只会取到最新的版本。
setTimeRange:指定最大的时间戳和最小的时间戳,只有在此范围内的 Cell 才能被获取。
setTimeStamp:指定时间戳。
setFilter:指定 Filter 过滤不需要的信息。
2) Scan 特有的方法如下。
setStartRow:指定开始的行。如果不调用,从表头开始。
setStopRow:指定结束的行(不含此行)。
setBatch:指定最多返回的 Cell 数目。防止一行中有过多的数据,导致 OOM 错误。
3) Result 代表是一行的数据。常用方法有以下几个。
getRow:返回 Row Key。
raw:返回所有的 KeyValue 数组。
getValue:按照 Column 来获取 Cell 的值。
ResultScanner 是 Result 的一个容器,每次调用ResultScanner 的next 方法会返回Result。
public Result next() throws IOException;
public Result [] next(int nbRows) throws IOException;
示例代码如下。
Scan scan = new Scan();
scan.setMaxVersions();
ResultScanner ss = table.getScanner(scan);
for(Result r:ss){
System.out.println(new String(r.getRow()));
for(KeyValue kv:r.raw){
System.out.println(new String(kv.getColumn()));
}
}
6、 插入数据
HTable 通过 put 方法插入数据,可以传递单个 put 对象 或 List put 对象分别实现单条插入和批量插入。
public void put(final Put put) throws IOException
public void put(final List< Put> puts) throws IOException
Put 提供3 种构造方式。
public Put(byte [] row)
public Put(byte [] row)
public Put(byte [] row,RowLock rowLock)
public Put(Put putToCopy)
Put 常用的方法有以下几个。
1)add:增加一个 Cell。
2)setTimeStamp:指定所有 Cell 默认的 timestamp,如果一个 Cell 没有指定 timestamp,就会用到这个值。如果没有调用,HBase 会将当前时间作为未指定 timestamp 的Cell 的 timestamp。
3)setWriteToWAL:WAL 是 Write Ahead Log 的缩写,指的是 HBase 在插入操作前是否写 Log。默认是打开,关掉会提高性能,但是如果系统出现故障(负责插入的Region Server 挂掉),数据可能会丢失。
另外 HTable 也有两个方法会影响插入的性能。
1)setAutoFlash:AutoFlush 指的是在每次调用 HBase 的 Put 操作,是否提交到 HBase Server。默认是 true,每次会提交。如果此时是单条插入,就会有更多的I/O,从而降低其性能。
2)setWriteBufferSize:Write Buffer Size 在 AutoFlush 为false 的时候起作用,默认是 2MB,也就是插入数据超过 2MB,就会自动提交到 Server。
示例代码如下。
HTable table = new HTable(hbaseConfig, tableName);
table.setAutoFlush(autoFlush);
List< Put> lp = new ArrayList< Put>();
int count = ;
byte[] buffer = new byte[];
Random r = new Random();
for(int i = ;i <= count;++i){
Put p = new Put(String.format("row%09d",i).getBytes());
r.nextBytes(buffer);
p.add("f1".getBytes(), null, buffer);
p.add("f2".getBytes(), null, buffer);
p.add("f3".getBytes(), null, buffer);
p.add("f4".getBytes(), null, buffer);
p.setWriteToWAL(wal);
lp.add(p);
if(i%==){
table.put(lp);
lp.clear();
}
}
7、 删除数据
HTable 通过 delete 方法删除数据。
public void delete(final Delete delete)
Delete 构造方法如下。
public Delete(byte [] row)
public Delete(byte [] row, long timestamp, RowLock rowLock)
public Delete(final Delete d)
Delete 常用方法有 deleteFamily/deleteColumn,用来指定要删除的 Family 或者 Column 的数据。 如果不调用任何这样的方法,将会删除整行。
注意: 如果某个 Cell 的 timestamp 高于当前时间,这个 Cell 将不会被删除,仍然可以查出来。
示例代码如下。
HTable table = new HTable(hbaseConfig,"mytest");
Delete d = new Delete("row1".getBytes());
table.delete(d)
8、 切分表
HBaseAdmin 提供 split 方法将 table 进行切分。
public void split(final String tableNameOrRegionName)
如果提供的是 tableName,会将 table 所有 Region 进行切分;如果提供的是 RegionName,只会切分这个Region。Split 是一个异步操作,因此它并不能确切控制 Region 的个数。
示例代码如下。
public void split(String tableName,int number,int timeout) throws Exception{
Configuration HBASE_CONFIG = new Configuration();
HBASE_CONFIG.set("hbase.ZooKeeper.quorum",GlobalConf.ZOOKEEPER_QUORUM);
HBaseConfiguration cfg = new HBaseConfiguration(HBASE_CONFIG);
HBaseAdmin hAdmin = new HBaseAdmin(cfg);
HTable hTable = new HTable(cfg,tableName);
int oldsize = ;
long time = System.currentTimeMillis();
while(true){
int size = hTable.getRegionsInfo().size();
logger.info("the region number="+size);
if(size>=number) break;
if(size !=oldsize){
hAdmin.split(hTable.getTableName());
oldsize = size;
}else if(System.currentTimeMillis()-time>timeout){
break;
}
Thread.sleep(*);
}
}
以上就是博主为大家介绍的这一板块的主要内容,这都是博主自己的学习过程,希望能给大家带来一定的指导作用,有用的还望大家点个支持,如果对你没用也望包涵,有错误烦请指出。如有期待可关注博主以第一时间获取更新哦,谢谢!
HBase 相关API操练(二):Java API的更多相关文章
- HBase操作(Shell与Java API)
版权声明:本文为博主原创文章,未经博主允许不得转载. 转: http://blog.csdn.net/u013980127/article/details/52443155 下面代码在Hado ...
- 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 ...
- HBase(0.96)新的Java API操作
package test; import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.ap ...
- html5 canvas常用api总结(二)--绘图API
canvas可以绘制出很多奇妙的样式和美丽的效果,通过几个简单的api就可以在画布上呈现出千变万化的效果,还可以制作网页游戏,接下来就总结一下和绘图有关的API. 绘画的时候canvas相当于画布,而 ...
- ZooKeeper(二)Java API使用
ZooKeeper官网提供了Java和C的API. 本文使用Java API来实现ZooKeeper的基本操作. 前言 下图中的Replicated Database是包含完整数据树(entire d ...
- Elasticsearch Java API深入详解
0.题记 之前Elasticsearch的应用比较多,但大多集中在关系型.非关系型数据库与Elasticsearch之间的同步.以上内容完成了Elasticsearch所需要的基础数据量的供给.但想要 ...
- 使用Elasticsearch7 java api实现pdf全文检索
前提:pdf的内容是文字形式而不是图片形式! 一.方法 Elasticsearch实现pdf的全文检索,原理是将pdf转换为Base64,然后提取pdf的文字内容然后将其存储起来. Elasticse ...
- ElasticSearch Java api 详解_V1.0
/×××××××××××××××××××××××××××××××××××××××××/ Author:xxx0624 HomePage:http://www.cnblogs.com/xxx0624/ ...
- hadoop2-HBase的Java API操作
Hbase提供了丰富的Java API,以及线程池操作,下面我用线程池来展示一下使用Java API操作Hbase. 项目结构如下: 我使用的Hbase的版本是 hbase-0.98.9-hadoop ...
随机推荐
- puppet插件fact和hiera(puppet自动化系列3)
四.Fact插件 4.1 使用pluginsync进行发布 这种方法比较特殊,节点factpath目录里除了编写好的rb文件之外,还需要在puppet模块中引用,运行一次之后才会转换成fact.通常在 ...
- 【转】 Pro Android学习笔记(五六):配置变化
目录(?)[-] Activity的destorycreate过程 Fragment的destorycreate过程 onSaveInstanceState saveFragmentInstanceS ...
- [MySQL]关于Com_状态
MySQL 5.5官方文档: http://dev.mysql.com/doc/refman/5.5/en/server-status-variables.html#statvar_Com_xxx C ...
- Ruby模块(module)
Ruby模块(module) 2013-04-03 16:47:09| 分类: Ruby | 标签:ruby require load extend include |字号 订阅 ...
- QTP使用outlook发送邮件
'发邮件 Dim objOutlook Dim objOutlookMsg Dim olMailItem ' Create the Outlook object and the new mail ...
- java 中Int和Integer区别以及相关示例
Java是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入不是对象的基本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型(wrappe ...
- CentOS7下二进制文件安装MySQL5.6
1.查看已装包 [root@host2 ~]# rpm -qa | grep mysql mysql-libs-5.1.71-1.el6.x86_64 [root@host2 ~]# [root@ho ...
- Docker Compose实例
采用java -jar启动 nohup java -jar web--SNAPSHOT.jar --spring.profiles.active=test --server.port= & 采 ...
- 1.从GUI到MVC
GUI(graphic user interface 用户图形界面).GUI编程的目的是提供交互性,并根据用户的操作实时的更新界面.用户的操作是不可预知的鼠标和键盘事件,我们如何保持同步和更新?在上层 ...
- 【MySQL】MySQL悲观锁 + 事物 + for update 解决普通流量并发的问题
使用mysql悲观锁解决并发问题 最近学习了一下数据库的悲观锁和乐观锁,根据自己的理解和网上参考资料总结如下: 悲观锁介绍(百科): 悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事 ...