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);    }}


1.1 单行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

0 0