使用Scan的时候,可以配合各种Filter进行数据的筛选以减少返回的数据量,同样也可以通过选择特定的列族和列来减少返回的数据量。若是能将该特性进一步的优化则HBase会更强大。HBase在0.92版本后引入了协处理器来实现该功能。
协处理器允许用户在region服务器上运行自己的代码,更准确的说是允许用户执行region级的操作,并且可以使用与RDBMS中的触发器类似的功能。在客户端,用户不用关系操作具体在哪里执行,HBase的分布式框架会帮助用户把这些工作变得透明。有点类似MapReduce。
使用协处理器的好处显而易见,可以将运算放到server端,减少通信开销的同时还能有效的提升性能。
协处理的两种类型
- 系统协处理器:可以全局导入region server上的所有数据表
- 表协处理器:用户可以指定一张表使用协处理器
协处理器框架为了更好支持其行为的灵活性,提供了两个不同方面的插件。
- 观察者(observer),类似于关系数据库的触发器(主动触发),在一些特定事件发生的时候被执行。这些时间包括一些用户产生的事件,也包括服务器端内部产生的事件。
- 终端(endpoint),动态的终端有点像存储过程。除了事件处理之外还需要将用户自定义操作添加到服务器端。用户代码可以被部署到管理数据的服务器端。endpoint通过添加一些远程调用来扩展RPC协议。
Observer
观察者的设计意图是允许用户通过插入代码来重载协处理器框架的upcall
方法,而具体的事情触发的callback
方法由HBase的核心代码来指定。协处理器框架处理所有的callback
调用细节,协处理器自身只需要插入添加或者改变的功能。
Observer提供的接口:
- RegionObserver:提供客户端的数据操作时间钩子:Get、Put、Delete和Scan等
- WALObserver:提供WAL相关操作钩子
- MasterObserver:提供DDL类型的操作钩子,如创建、删除、修改数据表等。
这些接口可以同时使用在同一个地方,按照不同的优先级顺序执行,用户可以任意基于协处理器实现负责的HBase功能层,HBase有很多种时间可以出发观察者方法,这些事件与方法从HBase0.92版本起,都会集成在HBase中。不过这些API可能会由于各种原因有所改动,不同版本的接口改动比较大。
endpoint
endpoint是HBase的一种通用扩展。当endpoint安装在集群上时,它扩展了HBase的RPC协议,对客户端应用开放了新方法。就像observer一样,endpoint在RegiionServer上执行,紧挨着你的数据。
endpoint协处理类似于其他数据库引擎中的存储过程。从客户端看,调用一个endpoint协处理器类似于调用其他HBase命令,只是其功能建立在定义协处理器的定制代码上,通常先创建请求对象,然后把它传给HtableInterface在集群上执行,最后收集结果。
单个region
单个行键调用coprocessorProxy()。返回一个CoprocessorProtocol接口的动态代理,它使用包含给定行键的region作为RPC endpoint,即使给空行键鬼影的行不存在也不影响。
一段范围的region
通过起始行键和终止行键调用coprocessorExec()。表中包含在起始行键到终止行键范围内的所有region都将作为RPCendpoint
实现一个endpoint的步骤
- 扩展CoprocessorProtlcol接口
这一步将设定与新endpoint的通信细节,即定义了客户端和服务店的RPC协议 - 扩展BaseEndpointCoprocessor类
用户必须实现endpoint设计的方法,包括抽象类BaseEndpointCoprocessor,以及之前定义的endpoint协议接口
协处理器的配置方法
- 启用全局aggregation,能操作所有表上的数据,通过修改hbase-site.xml配置文件实现,添加如下示例代码:
1 | <property> |
- 启用表aggregation,只对特定的表生效。通过HBase shell来实现
1 | 1.disable指定表 |
协处理器配置格式
以”|”分割的几个属性
- file path文件路径
- classname协处理器的类名
- priorty优先级
- arguments参数
- API调用
1 | HTableDescriptor htd = new HTableDescriptor("test"); |
协处理器配置的加载顺序:先加载配置文件中定义的协处理器,后加载表描述符中的协处理器
COPROCESSOR$