HBase权威指南(二)客户端API基础

1、概述

HBase的主要客户端接口是由org.apache.hadoop.hbase.client包中的HTable类提供
所有修改数据的操作都保证了行级别的原子性,要么读到最新的修改,要么等待系统允许写入该行修改
尽量使用批量处理更新来减少单独操作同一行数据的次数
创建HTable实例时有代价的,每个实例都需要扫描.META.表以检查该表是否存在可用,推荐每个线程只创建一次HTable实例,如果需要使用多个HTable实例,应考虑HTablePool类

2、CURD

put

void put(Put put) throws IOException

Put(byte[] row)
Put(byte[] row, RowLock rowLock)
Put(byte[] row, long ts)
Put(byte[] row, long ts, RowLock rowLock)
Put add(byte[] family, byte[] qualifier, byte[] value)
Put add(byte[] family, byte[] qualifier, long ts, byte[] value)
Put add(KeyValue kv) throws IOException
public static void main(String[] args) throws IOException {
  Configuration conf = HBaseConfiguration.create();
  HTable table = new HTable(conf, "testtable");
  Put put = new Put(Bytes.toBytes("row1"));
  put.add(Bytes.toBytes("colfam1"), Bytes.toBytes("qual2"), Bytes.toBytes("val2"));
  table.put(put)
}

KeyValue类

特定单元格的数据以及坐标,坐标包括行键、列族名、列限定符以及时间戳
KeyValue(byte[] row, int roffset, int rlength, byte[] family, int foffoset, int flength, byte[] qualifier, int qoffset, int qlength, long timestamp, Type type, byte[] value, int voffset, int vlength)
每一个字节数组都有一个offset参数和一个length参数,允许用户提交一个已经存在的字节数组进行字节级别操作。
行目前来说指的是行键,即Put构造器里的row参数。

客户端的写缓冲区

每个put操作实际上都是一个RPC操作,它将客户端数据传送到服务器然后返回。
HBase的API配备了一个客户端的写缓冲区,缓冲区负责收集put操作,然后调用RPC操作一次性将put送往服务器。

void setAutoFlush(boolean autoFlush)
boolean isAutoFlush()
图片.png

Put列表

void put(List puts) throws IOException
批量提交可能会有部分修改失败

原子性操作compare-and-set

如果检查成功通过,就执行put操作,否则就彻底放弃修改操作。
`boolean checkAndPut(byte[] row, byte[] family, byte[] qualifier, )

get

Result get(Get get) throws IOException

Get(byte[] row)
Get(byte[] row, RowLock rowLock)
Get addColumn(byte[] family, byte[] qualifier)
Get addFamily(byte[] family)

Result类

当用户使用get()方法获取数据,HBase返回的结果包含所有匹配的单元格数据,这些数据被封装在一个Result实例中返回给用户。

byte[] getValue(byte[] family, byte[] qualifier)
byte[] value()
byte[] getRow()
int size()
boolean isEmpty()
KeyValue[] raw()
List list()

delete

void delete(Delete delete) throws IOException

Delte(byte[] row)
Delete(byte[] row, long timestamp, RowLock rowLock)
Delete deleteFamily(byte[] family)
Delete deleteFamily(byte[] family, long timestamp)
Delete deleteColumns(byte[] family, byte[] qualifier)
Delete deleteColumn(byte[] family, byte[] qualifier) // 只删除最新版本

3、批量处理操作

Row是Put Get Delete的父类
void batch(List actions, Object[] results) throws IOException, InterruptedException
Object batch(List actions) throws IOException, InterruptedException

4、行锁

region服务器提供了行锁特性,这个特性保证了只有一个客户端能获取一行数据相应的锁,同时对该行进行修改。
如果不显示指定锁,服务器会隐式加锁

5、扫描

scan,类似数据库系统中的cursor,利用了HBase提供的底层顺序存储的数据结构。
调用HTable的getScanner就可以返回扫描器

ResultScanner getScanner(Scan scan) throws IOException
ResultScanner getScanner(byte[] family) throws IOException

Scan类构造器可以有startRow,区间一般为[startRow, stopRow)

Scan(byte[] startRow, Filter filter)
Scan(byte[] startRow)

ResultScanner

以行为单位进行返回

Result next() throws IOException
Result[] next(int nbRows) throws IOException
void close()

缓存与批量处理

每一个next()调用都会为每行数据生成一个单独的RPC请求
可以设置扫描器缓存

void setScannerCaching(itn scannerCaching)
int getScannerCaching()

缓存是面向行一级操作,批量是面向列一级操作

void setBatch(int batch)
int getBatch

RPC请求的次数=(行数*每行列数)/Min(每行的列数,批量大小)/扫描器缓存

你可能感兴趣的:(HBase权威指南(二)客户端API基础)