【本文详细介绍了HBase中协处理器相关的基本概念,欢迎读者朋友们阅读、转发和收藏!】
1 基本概念
如果要统对 HBase 中的数据,进行某种统计,比如统计某个字段最大值,统计满足某种条件的记录数,统计各种记录特点,并按照记录特点分类(类似于 sql 的 group by )。常规的做法就是把 HBase 中整个表的数据 scan 出来,或者稍微环保一点,加一个 filter ,进行一些初步的过滤(对于 rowcounter 来说,就加了 FirstKeyOnlyFilter ),但是这么做来说还是会有很大的副作用,比如占用大量的网络带宽(当标级别到达千万级别,亿级别之后)尤为明显, RPC 的量也是不容小觑的。
使用 Scan 的时候,可以配合各种 Filter 进行数据的筛选以减少返回的数据量,同样也可以通过选择特定的列族和列来减少返回的数据量。若是能将该特性进一步的优化则 HBase 会更强大。 HBase 在 0.92 版本后引入了 协处理器 来实现该功能。
协处理器 允许用户在 region 服务器上运行自己的代码,更准确的说是允许用户执行 region 级的操作,并且可以使用与 RDBMS 中的触发器类似的功能。在客户端,用户不用关系操作具体在哪里执行, HBase 的分布式框架会帮助用户把这些工作变得透明。有点类似 MapReduce 。
使用协处理器的好处显而易见,可以将运算放到 server 端,减少通信开销的同时还能有效的提升性能。
协处理的两种类型:系统协处理器: 可以全局导入 region server 上的所有数据表; 表协处理器: 用户可以指定一张表使用协处理器。
协处理器框架为了更好支持其行为的灵活性,提供了两个不同方面的插件。
观察者( observer ) ,类似于关系数据库的触发器(主动触发),在一些特定事件发生的时候被执行。这些事件包括一些用户产生的事件,也包括服务器端内部产生的事件。
终端( endpoint ) ,动态的终端有点像存储过程。除了事件处理之外还需要将用户自定义操作添加到服务器端。用户代码可以被部署到管理数据的服务器端。 endpoint 通过添加一些远程调用来扩展 RPC 协议。
1.1 Observer
观察者的设计意图是允许用户通过插入代码来重载协处理器框架的 upcall 方法,而具体的事情触发的 callback 方法由 HBase 的核心代码来指定。协处理器框架处理所有的 callback 调用细节,协处理器自身只需要插入添加或者改变的功能。
Observer 提供的接口:
RegionObserver :提供客户端的数据操作时间钩子: Get 、 Put 、 Delete 和 Scan 等
WALObserver :提供 WAL 相关操作钩子
MasterObserver :提供 DDL 类型的操作钩子,如创建、删除、修改数据表等。
这些接口可以同时使用在同一个地方,按照不同的优先级顺序执行,用户可以任意基于协处理器实现负责的 HBase 功能层, HBase 有很多种时间可以出发观察者方法,这些事件与方法从 HBase0.92 版本起,都会集成在 HBase 中。不过这些 API 可能会由于各种原因有所改动,不同版本的接口改动比较大。
1.2 endpoint
endpoint 是 HBase 的一种通用扩展。当 endpoint 安装在集群上时,它扩展了 HBase 的 RPC 协议,对客户端应用开放了新方法。就像 observer 一样, endpoint 在 RegiionServer 上执行,紧挨着你的数据。
endpoint 协处理类似于其他数据库引擎中的存储过程。从客户端看,调用一个 endpoint 协处理器类似于调用其他 HBase 命令,只是其功能建立在定义协处理器的定制代码上,通常先创建请求对象,然后把它传给 HtableInterface 在集群上执行,最后收集结果。
1.3 region
单个行键调用 coprocessorProxy() 。返回一个 CoprocessorProtocol 接口的动态代理,它使用包含给定行键的 region 作为 RPC endpoint ,即使给空行键鬼影的行不存在也不影响。
一段范围的 region 通过起始行键和终止行键调用 coprocessorExec() 。表中包含在起始行键到终止行键范围内的所有 region 都将作为 RPCendpoint。