hbase 客户端_读《HBase权威指南》 客户端API:基础知识

efaccf010bc70264f2db78393c9c59bf.png

HBase 的主要客户端接口是由 org.apache.hadoop.hbase.client 包中的 HTable 类提供的。

创建 HTable 实例是有代价的。每个实例都需要扫描 .META. 表,以检查该表是否存在、是否可用,此外还要执行一些其他操作,这些检查和操作导致实例调动非常耗时。因此,建议用户只创建一次 HTable 实例,而且是每个线程只创建一个,然后在客户端应用的生存期内复用这个对象。

CURD

https://github.com/larsgeorge/hbase-book

put 方法

单行 put

void put(Put put) throws IOException

其中 Put 对象是由以下几个构造函数创建的:

Put(byte[] row)Put(byte[] row, RowLock rowLock)Put(byte[] row, long rs)Put(byte[] row, long rs, RowLock rowLock)

创建 Put 实例时用户需要一个行键 row,在 HBase 中每行数据都有唯一的行键(row key)作为标识。

创建 Put 实例之后,就可以向该实例添加数据,添加数据的方法如下:

Put add(byte[] family, byte[] qulifier, byte[] value)Put add(byte[] family, byte[] qulifier, long ts, byte[] value)Put add(KeyValue ky) throws IOException

每一次调用 add() 都可以特定地增加一列数据,如果再加一个时间戳选项,就能形成一个数据单元格。

// 创建所需的配置Configuration conf = HBaseConfiguration.create();// 实例化一个新的客户端HTable table = new HTable(conf, "testtable");// 指定一行来创建一个 PutPut put = new Put(Bytes.toBytes("row1")); // 向 Put 中添加一个名为 "colfam1:qual1" 的实例put.addColumn(Bytes.toBytes("colfam1"), Bytes.toBytes("qual1"), Bytes.toBytes("val1"));// 向 Put 中添加一个名为 "colfam1:qual2" 的实例put.addColumn(Bytes.toBytes("colfam1"), Bytes.toBytes("qual2"), ytes.toBytes("val2")); // 将这一行存储到 HBase 表中table.put(put);

HBase 的 API 配备了一个客户端的写缓冲区,缓冲区负责收集 put 操作,然后调用 RPC 操作一次性将 put 送往服务器。默认情况下,客户端缓冲区是禁用的。可以通过将自动刷写(autoflush)设置为 false 来激活缓冲区,调用如下:

table.setAutoFlush(false);

客户端 Put 操作按所属 region 服务器排序和分组:

015d3b5db2e673e93a76d30d10503f83.png

Put 列表

void put(List puts) throws IOException

当使用基于列表的 put 调用时,需要特别注意:用户无法控制服务器端执行 put 的顺序,这意味着服务器被调用的顺序也不受用户控制。

原子性操作 compare-and-set

boolean checkAndPut(byte[] row, byte[] family, byte[] qualifier, byte[] vlue, Put put)  throws IOException

这种特别的 put 调用,能保证自身操作的原子性。

get 方法

单行 get

Result get(Get get) throws IOException

其中 Get 对象是由以下几个构造函数创建的:

Get(byte[] row)Get(byte[] row, RowLock rowLock)

虽然一次 get() 操作只能取一行数据, 但不会限制一行当中取多少列或者多少单元格。

默认情况下,版本数为 1,即 get() 请求返回最新的匹配版本。

从 HBase 中获取数据的应用:

// 创建配置实例Configuration conf = HBaseConfiguration.create();// 初始化一个新的表引用HTable table = new HTable(conf, "testtable");// 使用一个指定的行键构建一个 Get 实例Get get = new Get(Bytes.toBytes("row1")); // 向 Get 中添加一个列get.addColumn(Bytes.toBytes("colfam1"), Bytes.toBytes("qual1"));// 从 HBase 中获取指定列的行数据Result result = table.get(get);// 从返回的结果中获取对应列的数据byte[] val = result.getValue(Bytes.toBytes("colfam1"), Bytes.toBytes("qual1"));// 将数据转化为字符串打印输出System.out.println("Value:" + Bytes.toString(val));

Get 列表

Result[] get(List gets) throws IOException

删除方法

单行删除

void delete (Delete delete) throw IOException

其中 Delete 对象是由以下几个构造函数创建的:

Delete(byte[] row)Delete(byte[] row, long timestmap, RowLock rowLock)

Delete 的列表

void delete(List deletes) throws IOException

用户不能对删除操作在远程服务器上的执行顺序做任何假设。API 会重新排列它们,并将同一个 region 服务器的操作集中到一个 PRC 请求中以提升性能。

行锁

region 服务器提供了一个行锁(row lock)的特性,这个特性保证了只有一个客户端能获取一行数据相应的锁,同时对该行进行修改。

每一个排他锁(unique lock),无论是由服务器提供的,还是通过客户端 API 传入的,都能保护这一行不被其他锁锁住。当一个锁被服务器端或客户端显式获取之后,其他所有想要对这行数据加锁的客户端将会等待,直到当前锁被释放,或者锁的租期超时。

默认的锁超时时间是一分钟,但可以在 hbase-site.xml 文件中添加配置修改这个默认值,时间以毫秒为单位:

hbase.regionserver.lease.period120000

Get 需要锁么?

Get(byte[] row, RowLock rowLock)

这是遗留的方法,但服务器根本用不着这种方法,因为在获取数据的过程中,服务器根本不需要任何锁,而是应用一个多版本的并发控制机制来保证行级读操作。

扫描

ResultScanner getScanner(Scan scan) throws IOExcepionResultScanner getScanner(byte[] family) throws IOExceptionResultScanner getScanner(byte[] family, bytep[ qualifier) throws IOException

Scan 类拥有以下构造器:

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

ResultScanner类

扫描操作不会通过一次 RPC 请求返回所有匹配的行,而是以行为单位进行返回。

ResultScanner 的一些方法如下:

Result next() throws IOExceptionResult[] next(int nbRows) throws IOExceptionvoid close()

每一个 next() 调用都会为每行数据生成一次单独的 RPC 请求。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值