标签:style class blog code java http
HBase基本的CRUD操作就不多介绍了,无非就是Put,Get,Delete三个类的运用。
本文相当于是阅读HBase权威指南的总结。
一、扫描(Scan)
现在看一下扫描技术,这种技术类似于关系型数据库的游标(cursor),并利用到了HBase底层顺序存储的特性。
使用扫描的一般步骤是:
1、创建Scan实例 2、为Scan实例增加扫描的限制条件 3、调用HTable的getScanner()方法获取ResultScanner对象 4、迭代ResultScanner对象中的Result对象访问扫描结果行。
(1)创建Scan实例:
构造方法如下:
可以创建定义了起始行健和结束行健的Scan对象,返回的包含定义的起始行,但是不包含结束行。
可以创建定义了过滤器的Scan对象,过滤器的内容稍后介绍。
也可以创建空白的Scan对象。
(2)创建好Scan对象之后,还可以增加更多的扫描限制条件:
比如可以限制返回数据的列族,也可以限制返回数据的列:
还可以限制返回结果的时间戳,时间范围,甚至限定只返回每一列的一些特定版本:
除此之外还可以设置过滤器,起始行,结束行等:
注意:上述所有Scan类的方法返回的都是Scan对象,使用的是Builder模式,可以再一行代码中同时设置多个限制条件。
(3)下面就可以获取ResultScanner对象:
(4)返回ResultScannner对象之后就可以开始迭代了:
可以直接转换为迭代器迭代,也可以直接用foreach语法迭代:
ResultScanner scanner=table.getScanner(scan);//执行扫描查找 Iterator<Result> res=scanner.iterator( );//返回查询遍历器 或者 for(Result res: scanner) { 访问Result获取行数据 }注意:扫描操作不会通过一次RPC操作返回所有匹配的行,而是会以行为单位进行返回。
因为一次PRC操作就返回所有匹配数据的话数据量太大,会占用大量的系统资源并花费大量的时间。
1、缓存
根据上面的介绍,迭代ResultScanner的时候每一次显示或者隐式的next()方法的调用都会产生一次单独RPC请求,显然当单元格数据量较小是性能不好。
可以让一次RPC请求获取更多的数据,这就是扫描器缓存(Scanner caching)的作用,默认是关闭的。
可以再三个层面上打开扫描器缓存:
(1)表HTable的层面,这样由该表产生的所有扫描器实例的缓存都会生效。
(2)扫描器Scanner的层面,这样只会影响当前的扫描器实例。
(3)整个客户端层面,需要修改hbase-site.xml配置文件,这样针对所有的Scanner实例都会生效。
设置扫描器缓存的大小就能控制每次RPC请求取回的行数了!!!
但是扫描器缓存无疑会增加客户端和服务器端的内存消耗,用户需要在少量的ROC请求次数和客户端以及服务端内存消耗之间找到平衡点。
如果扫描器缓存大小设置太大,每次next操作返回的时间就会变长,如果客户端的数据超过了堆的大小,就会得到一个OutOfMemoryException。
2、批量
还有一个问题,有些行数据量非常大,可能超过客户端进程内存的容量,可以用批量(Batch)解决。
缓存是面向行一级的操作,而批量是面向列一级的操作。
批量可以让用户选择每一次ResultScanner实例的next操作要取回多少列。
二、过滤器(Filter)
过滤器提供了非常强大的特性来帮助用户提高处理表中数据的效率,用户不仅可以使用HBase中预定义好的过滤器,还可以实现自定义的过滤器。
HBase中两种主要的数据读取机制是Get和Scan,都支持添加更多的限制条件来减少查询得到的数据量,这些限制条件可以是列族,列,时间戳及版本号。
但是他们缺少一些细粒度的筛选功能,比如基于正则表达式的对于行健和值进行筛选,过滤器可以做到。
Get和Scan两个类都支持过滤器,所有过滤器都在服务端生效,这称作谓词下推(predicate push down),这样可以保证被过滤掉的数据不会被传送到客户端。
过滤器属性和它们之间的兼容性:
更多详细介绍放到以后。。。
HBase概念学习(三)Java API之扫描和过滤器,布布扣,bubuko.com
标签:style class blog code java http
原文地址:http://blog.csdn.net/jiyiqinlovexx/article/details/31460685