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()
Put列表
void put(List
批量提交可能会有部分修改失败
原子性操作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
Object batch(List
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(每行的列数,批量大小)/扫描器缓存