《HBase权威指南》读书笔记4

第四章 客户端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只要有一个通过就返回
而且过滤器执行的顺序就是你传入list的顺序

自定义过滤器

可以实现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
STOPPINGstop()方法被调用之前的状态
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);





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值