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 服务器排序和分组:

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 请求。

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

  1. JavaScript权威指南--客户端存储

    客户端存储web应用允许使用浏览器提供的API实现将数据存储在用户电脑上. 客户端存储遵循"同源策略",因此不同站点的页面是无法读取对于存储的数据.而同一站点的不同的页面之间是可以 ...

  2. hbase 查询_云HBase发布全文索引服务,轻松应对复杂查询

    云HBase发布了"全文索引服务"功能,自2019年01月25日后创建的云HBase实例,可以在控制台免费开启此"全文索引服务"功能.使用此功能可以让用户在HB ...

  3. 读HTTP权威指南的体会

    国庆期间,我读了HTTP权威指南一书,现在我把总节为大家讲一下: Web 浏览器.服务器和相关的Web 应用程序都是通过HTTP 相互通信的.HTTP 是 现代全球因特网中使用的公共语言. 是对HTT ...

  4. python编写ftp客户端_用Python写FTP客户端程序

    0 前言: ftp客户端相信大家都用过,那么我们为什么还要用Python写ftp客户端呢? 我想有两个原因: 一是写出更好的ftp客户端应用程序,方便大家使用: 二是定制一些特殊服务,例如每天定时下载 ...

  5. MyCat权威指南阅读笔记(基础篇)

    1.1何为数据切分? 简单来说,就是指通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主 机)上面,以达到分散单台设备负载的效果. 数据的切分(Sharding)根据其切分规 ...

  6. java 网络爬虫 正则表达式_【干货】Java网络爬虫基础知识

    原标题:[干货]Java网络爬虫基础知识 引言 Java 网络爬虫具有很好的扩展性可伸缩性,其是目前搜索引擎开发的重要组成部分.例如,著名的网络爬虫工具 Nutch 便是采用 Java 开发,该工具以 ...

  7. java笔试必考知识_面试必备:常考Java基础知识总结(持续更新)

    本文的Java方面基础知识是我在面试过程中的积累和总结. Java基本数据类型.所占空间大小及对应包装类 基本类型 大小 包装类 boolean - Boolean char 16-bit Chara ...

  8. 区块链需要学习哪些东西_学习区块链需要哪些 这些基础知识要知道

    基于区块链技术未来的发展前景,以及区块链人才的严重紧缺,当前许多人都萌生了自学区块链技术的想法,可是作为一种刚刚兴起几年而已的技术,如何能做到高效地学习呢?掌握合理地方式十分关键,分清主次,紧抓基础是 ...

  9. NIFI分页获取Mysql数据_导入到Hbase中_并可通过phoenix客户端查询_含金量很高的一篇_搞了好久_实际操作05---大数据之Nifi工作笔记0045

    然后我们来看,如何从mysql中,进行分页获取数据,然后把数据导入到hbase中去,这里 刚开始是通过phoenix,想通过phoenix来操作hbase, 但是弄了好久啊...报错...不知道为什么 ...

最新文章

  1. 终于“打造”出了一个可以随时随地编程的工具
  2. python非官方的二进制扩展包下载地址
  3. Java中的隐藏实现细节
  4. get,put,post,delete含义与区别
  5. 从 Spark Streaming 到 Apache Flink : 实时数据流在爱奇艺的演进
  6. 文献学习(part47)--A novel consensus learning approach to incomplete multi-view clustering
  7. MySQL——通过EXPLAIN分析SQL的执行计划
  8. duilib环境配置以及简单入门介绍
  9. 安装Ubuntu时的硬盘分区方案
  10. 使用Confluence如何输出一份结构清晰 可读性高的测试文档?
  11. Facebook开发地面技术扩大互联网连接
  12. androidstudio身高预测app
  13. dToF与iToF技术解析
  14. Codeforces 311D Interval Cubing 数学 + 线段树 (看题解)
  15. 【JVM】元空间与永久代区别
  16. iOS开发-点击屏幕,键盘消失的极佳方法。
  17. 推荐系统_(一)算法详解
  18. Amazon、Google、IBM、Microsoft的云计算平台及其特点
  19. 送你一张带数据点分布的世界地图
  20. [招聘信息]Automation Engineer@EMC

热门文章

  1. iOS系统预览文件但不分享的实用技巧 (iOS10, QLPreviewController)
  2. C#开发命令执行驱动程序 之 控制标志的命令行参数
  3. Windows下安装NPM
  4. 怎么去掉网页上复制到word的文章中各种符号例如向下箭头(↓)?
  5. javascript xml转json
  6. 【HDU2825】Wireless Password【AC自动机,状态压缩DP】
  7. 【译】使用 CocoaPods 模块化iOS应用
  8. silverlight 自定义资源整理(待后续补充)
  9. Nhibernate中Unexpected row count的一种解决办法
  10. linux的centos7安装mysql5.7服务教程