第四章 客户端API:高级特性
4.1过滤器
- 所有过滤器都在服务器端生效,叫 谓词下推(predicate push down)
- 继承自compareFilter的Filter比较特殊,多了一个 compare() 方法
HBase内置比较器comparator
比较器 | 描述 |
---|---|
BinaryComparator | 使用Bytes.compareTo() 比较当前值与阀值 |
BinaryPrefixComparator | 与上面的相似,使用Bytes.compareTo()进行匹配,但是是从左端开始前缀匹配 |
NullComparator | 不做匹配,只判断当前值是不是Null |
BitComparator | 通过BitwiseOp类提供的按位与(AND)、或(OR)、异或(XOR)操作执行位数级比较 |
RegexStringComparator | 根据正则表达式匹配 |
SubstringComparator | 通过contains()操作匹配字符串 |
后面的三种比较器 BitComparator, RegexStringComparator, SubstringComparator 只能与 EQUAL, NOT_EQUAL 运算符搭配使用。因为这些比较器匹配完只返回0或者1
行过滤器(row filter)
行过滤器用于过滤行键(rowkey)
思考:可以用行过滤器来做一个简易的查询客户端(类似HUE)
单列值过滤器(SingleColumnValueFilter)
指定某列对其进行值比较(使用频率最高的filter)
setFilterIfMissing(true)可以将不存在该列的行过滤掉,否则如果该列不存在也被放到查询结果中了
单列排除过滤器(SingleColumnValueExcludeFilter)
继承自 SingleColumnValueFilter 唯一的区别是查询结果不包含查询列
前缀过滤器(PrefixFilter)
所有与前缀匹配的行都会返回到客户端,可以看做是某种特殊的行过滤器,但是速度更快
分页过滤器(PageFilter)
可以设定pagesize,但是由于是分布式系统,所以可能返回的比需要的多。
客户端代码记录本次扫描的最后一行,下次获取记录的时候可以把这个行设定为本次扫描的起始行,并同时保留相同的过滤器属性,然后依次迭代。(记住最后一行这个动作要自己实现,具体可见实例代码,在此就不贴上来了)
技巧:因为起始行会被包含在本次扫描中,这样会造成,改行不仅在上次循环中出现,在本次循环中也要出现,所以起始行要加一个0,这样这行就不会出现在本次扫描中
首次行键过滤器(FirstKeyOnlyFilter)
只比较一行中的第一列,看起来没什么用,不过可以做 行数统计用
FilterList
可以组合多个Filter
操作 | 描述 |
MUST_PASS_ALL | 全部通过才返回 |
MUST_PASS_ONE | 只要有一个通过就返回 |
自定义过滤器
可以实现Filter接口或者继承 FilterBase
计数器
计数器其实也是一个列,只是通过 incr 和 get_incr 可以存入数值型和获取成数值型显示,否则都是二进制,无法实现+1递增
单计数器自增
table.incrementColumnValue()
多计数器自增
Increment i = new Increment();
i.addColumn(....);
协处理器
- 协处理器就是一个小型的MapReduce框架,增加在服务端的计算功能,让返回的结果集更小
- 用户需要自己编写java类并打包成jar来实现协处理器
- 与过滤器不同的是,协处理器可以被动态加载
- HBase的授权认证和审查就是基于协处理器的
协处理器分为两大类 observer 和 endpoint
observer
跟触发器类似:回调函数(hook)在某些特定的事件被触发的时候执行
协处理器提供了以下接口
- RegionObserver 处理数据修改事件
- MasterObserver 管理DDL级的操作
- WALObserver 提供控制WAL的钩子函数
endpoint
类似存储过程。endpoint 跟 observer 可以结合使用
所有协处理器都可以被链接起来使用
Coprocessor接口
所有协处理器的共同接口。
有两个枚举类 Priority 和 State
Coprocessor.Priority
值 | 说明 |
---|---|
SYSTEM | 高优先级 |
USER | 定义其他的协处理器,按顺序执行 |
CoprocessorEnviroment用来在协处理器的生命周期中保持其状态,提供了一些有用的方法
- getHBaseVersion
- getVersion 获取Coprocessor接口的版本
- getInstance() 返回加载的协处理器实例
- getPriority()
- getLoadSequence() 获取序号
- getTable( tableName) 返回HTable实例
协处理器应该用getTable方法获取HTable类,这样更安全,因为这个方法会加一些默认的安全措施,比如,协处理器不可以对一行数据加锁
Coprecessor.State
值 | 说明 |
---|---|
UNINSTALLED | 最初的状态,没有环境,也没有初始化 |
INSTALLED | 实例装载了它的环境参数 |
STARTING | 即将要开始工作,start()方法即将被调用 |
ACTIVE | 一旦start()方法被调用,当前状态就是active |
STOPPING | stop()方法被调用之前的状态 |
STOPPED | 一旦stop()方法将控制权交给框架,状态为stopped |
CoprocessorHost 类,维护所有协处理器和他们专用的环境
当region被打开的时候,协处理器会被加载
注意:用户不能指定那张表或者哪个region会被加载
如果用表描述符中加载就可以指定表格
HTablePool
相当于传统数据库的连接池,可以不断的复用这个实例
使用HTablePool来获取HTable 实例
Configuration conf = HBaseConfiguration.create();
HTablePool pool = new HTablePool(conf,5);
HTableInterface[] tables = new HTableInterface[10];
for(int n = 0; n<10; n++){
tables[n] = pool.getTable("testtable");
}
如果用户要显示的使用某个连接
Configuration newConfig = new Configuration(originalConf);
HConnection connection = HConnectionManager.getConnection(newConfig);
//.......to something
HConnectionManager.deleteConnection(newConfig, true);