HBase的两种协处理器
(2013-02-08 11:10:47)
1 Observer协处理器
为了理解observer协处理器,先来理解一个请求的生命周期是有帮助的。一个请求从客户端开始,创建一个请求对象,在HTableInterface实现上调用合适的方法。例如,创建一个Put实例,调用put()方法。HBase客户端基于行健定位到应该接收该Put的RegionServer,发起RPC调用。RegionServer收到Put,把它转交给合适的region。该Region处理该请求,然后构造一个返回给客户端的回应。这个过程如图5.1所示。
Observer位于客户端和HBase之间,在这个过程发生时修改数据访问。你可以在每个Get命令后运行一个observer,修改返回给客户端的结果。或者你可以在一个Put命令后运行一个observer,在客户端写入HBase的数据存入硬盘之前执行操作。你可以把observer协处理器想象成关系型数据库里的触发器(trigger)或者面向方面编程(aspect-oriented programming)里的建议(advice)。多个observer可以同时被登记,它们按照优先次序被执行。CoprocessorHost类代表region管理observer的登记和执行。一个RegionServer拦截一个Put命令的过程如图5.2所示。
一句警告
请记住,协处理器运行在和RegionServer相同的进程空间里。这意味着协处理器的代码拥有服务器上HBase用户进程的全部权限。也意味着出错的协处理器有潜在可能使进程崩溃。此时此刻并没有隔离保证。你可以通过跟踪JIRA单子[1] 来关注解决这个潜在问题的努力。
■ RegionObserver—这种observer钩在数据访问和操作阶段。所有标准的数据操作命令可以被pre-和post-hooks拦截。它也对region内部操作开放pre-和post-hooks,例如刷写MemStore和拆分region。RegionObserver运行在region上;因此同一个RegionServer上可以运行多个RegionObserver。可以通过模式更新或者配置hbase.coprocessor.region.classes属性来登记RegionObserver。
■ WALObserver—预写日志(write-ahead log)也支持observer协处理器。唯一可用的钩子是pre-和post-WAL写事件。和RegionObserver不同,WALObserver运行在RegionServer的环境里。可以通过模式更新或者配置hbase.coprocessor.wal.classes属性来登记WALObserver。
■ MasterObserver—为了钩住DDL事件,例如表创建或模式修改,HBase提供了MasterObserver。例如,当主表被删除时你可以使用postDeleteTable()钩子来删除第二个索引。这种observer运行在Master节点上。可以通过配置hbase.coprocessor.master.classes属性登记MasterObserver。
2 Endpoint协处理器
Endpoint是HBase的一种通用扩展。当endpoint安装在集群上时,它扩展了HBase RPC协议,对客户端应用开放了新方法。就像observer一样,endpoint在RegionServer上执行,紧挨着你的数据。
Endpoint协处理器类似于其他数据库引擎中的存储过程。从客户端看,调用一个endpoint协处理器类似于调用其他HBase命令,除了其功能建立在定义协处理器的定制代码上。先创建请求对象,然后把它传给HtableInterface在集群上执行,最后收集结果。可以按照你编写的任意Java代码做任何事情。
最基本的是,endpoint可以用来实现分散聚集算法(scatter-gather algorithm)。HBase随机附带了一个聚集示例:求和和求平均数这样的简单聚集计算的一个endpoint。AggregateImplementation实例在托管数据的节点上计算得到部分结果,然后AggregationClient在客户端进程里计算得到最终结果。一个实际使用的聚集计算例子如图5.3所示。
我们将展示给你如何实现这两种协处理器,以及演示在HBase安装中如何让这两种实现生效。