HBase协处理器

使用Scan的时候,可以配合各种Filter进行数据的筛选以减少返回的数据量,同样也可以通过选择特定的列族和列来减少返回的数据量。若是能将该特性进一步的优化则HBase会更强大。HBase在0.92版本后引入了协处理器来实现该功能。

协处理器允许用户在region服务器上运行自己的代码,更准确的说是允许用户执行region级的操作,并且可以使用与RDBMS中的触发器类似的功能。在客户端,用户不用关系操作具体在哪里执行,HBase的分布式框架会帮助用户把这些工作变得透明。有点类似MapReduce。

使用协处理器的好处显而易见,可以将运算放到server端,减少通信开销的同时还能有效的提升性能。

协处理的两种类型

  1. 系统协处理器:可以全局导入region server上的所有数据表
  2. 表协处理器:用户可以指定一张表使用协处理器

协处理器框架为了更好支持其行为的灵活性,提供了两个不同方面的插件。

  • 观察者(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的步骤

  1. 扩展CoprocessorProtlcol接口
    这一步将设定与新endpoint的通信细节,即定义了客户端和服务店的RPC协议
  2. 扩展BaseEndpointCoprocessor类
    用户必须实现endpoint设计的方法,包括抽象类BaseEndpointCoprocessor,以及之前定义的endpoint协议接口

协处理器的配置方法

  • 启用全局aggregation,能操作所有表上的数据,通过修改hbase-site.xml配置文件实现,添加如下示例代码:
1
2
3
4
<property>
<name>hbase.coprocessor,user.region.classes</name>
<value>org.apache.hadoop.hbase.coprocessor.RowCountEndPoint</value>
</property>
  • 启用表aggregation,只对特定的表生效。通过HBase shell来实现
1
2
3
1.disable指定表
2.添加aggregation: alter 'test', METHOD=>'table_att', 'coprocessor1'=>'|org.acache/hadoop.coprocessor.RowCountEndPoint||'
3.重启指定表: enable 'test'

协处理器配置格式
以”|”分割的几个属性

  1. file path文件路径
  2. classname协处理器的类名
  3. priorty优先级
  4. arguments参数
  • API调用
1
2
3
HTableDescriptor htd = new HTableDescriptor("test");
htd.setValue("COPROCESSOR$1", path.toString() + "|" + RowCountEndpoint.class.getCanonicalName() + "|" +
Coprocessor.PRIORITY_USER);

协处理器配置的加载顺序:先加载配置文件中定义的协处理器,后加载表描述符中的协处理器

COPROCESSOR$中的number定义了加载顺序