HBase学习笔记(四)———《客户端API》
来源:互联网 发布:波兰算法 java 反向 编辑:程序博客网 时间:2024/04/29 19:17
HBase的主要客户端接口是由org.apache.hadoop.hbase.client包中的HTable类提供的,通过这个类,用户可以完成HBase存储和检索数据,以及删除无效数据之类的操作。所有修改数据的操作都保证了行级别的原子性,这会影响到这一行数据所有的并发读写操作。用户应当尽量使用批量处理(batch)更新来减少单独操作同一行数据的次数。创建HTable示例是有代价的。每个实例都需要扫描.META.表,以检查该表是否存在、是否可用,此外还要执行一些其他操作,这些检查和操作导致实例调用非常耗时。因此,推荐用户只创建一次HTable实例,而且是每个线程创建一个,然后在客户端应用的生存期内复用这个对象。如果用户需要使用多个HTable实例,应考虑使用HTablePool类。
数据库的初始基本操作通常被称为CRUD(Create, Read, Update, Delete),具体指增、查、改、删。HBase中有与之对应的一组操作,这些方法都由HTable类提供。
1、put 方法—增加数据
import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.hbase.HBaseConfiguration;import org.apache.hadoop.hbase.client.HTable;import org.apache.hadoop.hbase.client.Put;import org.apache.hadoop.hbase.util.Bytes;import java.io.IOException;/** * Created by MJ on 15/9/14. */public class PutExample { public static void main(String[] args) throws IOException { // 创建所需的配置 Configuration conf = HBaseConfiguration.create(); // 实例化一个新的客户端 HTable hTable = new HTable(conf, "test_table"); // 指定一行来创建一个Put Put put = new Put(Bytes.toBytes("row1")); // 向Put中添加一个名为“column_family1:column1”,值为“value1” put.add(Bytes.toBytes("column_family1"), Bytes.toBytes("column1"), Bytes.toBytes("value1")); // 向Put中添加一个名为“column_family1:column2”,值为“value2” put.add(Bytes.toBytes("column_family1"), Bytes.toBytes("column2"), Bytes.toBytes("value2")); // 将这一行存储到HBase的“test_table”表中 hTable.put(put); }}
put方法:
void put (Put put) throws IOException
Put的几个构造函数如下:
Put(byte[] row)
Put(byte[] row, RowLock rowLock)
Put(byte[] row, long ts)
Put(byte[] row, long ts, RowLock rowLock)
创建Put实例时需要提供一个行键row,在HBase中每行数据都有唯一的行键(row_key)作为标识。
创建Put实例之后,就可以向该实例添加数据,添加数据的方法如下:
Put add(byte[] family, byte[] qualifier, byte[] value)
Put add(byte[] family, byte[] qualifier, long ts, byte[] value)
Put add(Cell kv) throws IOException
每一次add()都可以特定地添加一列数据,如果再加一个时间戳选项,就能形成一个数据单元格。注意:当不指定时间戳调用add()方法时,Put实例会使用来自构造函数的可选时间戳参数(也称作ts),如果用户在构造Put实例时也没有指定时间戳,则时间戳将会由region服务器设定。
获取Put实例内部添加的KeyValue实例需要调用与add()相反的方法get():
List<Cell> get(byte[] family, byte[] qualifier)
用户可以采用以下这些方法检查是否存在特定的单元格,而不需要遍历整个集合:
boolean has(byte[] family, byte[] qualifier)
boolean has(byte[] family, byte[] qualifier, long ts)
boolean has(byte[] family, byte[] qualifier, byte[] value)
boolean has(byte[] family, byte[] qualifier, long ts, byte[] value)
每一个put操作实际上都是一个RPC操作,它将客户端数据传送到服务器然后返回。
HBase的API配备了一个客户端的写缓冲区(write buffer),缓冲区负责收集put操作,然后调用RPC操作一次性将put送往服务器。全局交换机控制着该缓存区是否在使用,以下是其方法:
void setAutoFlush(boolean autoFlush)
boolean isAutoFlush( )
默认情况下,客户端缓冲区是禁用的。可以通过将自动刷写(autoflush)设置为false来激活缓冲区,调用如下:
hTable.setAutoFlush(false)
启用客户端缓冲机制后,用户可以通过 isAutoFlush( )方法检查标识的状态。当用户初始化创建一个HTable实例时,这个方法将返回true,如果有用户修改过缓冲机制,它将返回用户当前所设定的状态。激活客户端缓冲区之后,用户可以将数据存储到HBase中。此时的操作不会产生RPC调用,因为存储的Put实例保存在客户端进程的内存中。当需要强制把数据写到服务端时,可以调用另外一个API函数:
void flushCommits () throws IOException
flushCommits()方法将所有的修改传送到远程服务器。被缓冲的Put实例可以跨多行。客户端能够批量处理这些更新,并把它们传送到对于的region服务器。用户可以强制刷写缓冲区,不过这通常不是必要的,一旦数据超出缓冲指定的大小限制,客户端就会隐式地调用刷写命令。隐式刷写会在用户调用put()或者setWriteBufferSize()方法时触发。此外,调用HTable类的close()方法时也会无条件地隐式触发刷写。
客户端API可以插入单个Put实例,同时也有批量处理操作,其调用形式如下:
void put(List<Put> puts) throws IOException
- HBase学习笔记(四)———《客户端API》
- Hbase 学习笔记(一): 基础客户端API
- HBase学习笔记(一)———《HBase简介》
- hbase学习笔记(1)——hbase体系结构
- Hadoop学习笔记(四):HBase
- ArcGIS客户端开发学习笔记(五)——ArcGIS REST API基础
- Hbase 笔记(3) 客户端API基础
- Hbase 笔记(4) 客户端API高级性能
- Hbase 笔记(5) 客户端API 管理功能
- ArcGIS客户端开发学习笔记(四)——Dojo基础
- HBase学习笔记——基本操作:shell和java API
- hbase学习笔记——hbase基础概念理解
- HBase学习笔记——入门简介
- HBase学习笔记——逻辑视图
- HBase学习笔记——物理模型
- HBase学习笔记——系统架构
- 百度地图API学习笔记(四)
- 深度学习笔记——深度学习框架TensorFlow(四)[高级API tf.contrib.learn]
- 《Java编程思想》读书笔记1.对象导论
- xutils
- 1
- ac指令的简单实现
- uvaoj 1388 - Graveyard
- HBase学习笔记(四)———《客户端API》
- PCA--主成分分析(Principal components analysis)-最大方差解释
- java 转义字符
- 理解HTTP幂等性
- Web Services Tutorial with Apache CXF
- USACO-Section 2.2 Runaround Numbers (枚举)
- 第101讲:使用SBT开发Akka第一个案例源码解析MapActor、ReduceActor、AggregateActor学习笔记
- docker 搭建私有仓库及镜像存储目录结构
- 水平垂直投影