本章要点
- hbase协处理器有哪几种类型
- hbase协处理器如何部署
- 协处理器的主要接口,已经接口功能
- 自定义协处理器实例
协处理器类型
hbase协处理类型主要分为observer 和endpoint两种类型。
- observer
observer类似与传统RDBMS中的触发器:回调函数(也称作钩子函数,hook)在特定事件发生时执行,这些事件包括用户产生的事件,也包括服务器端内部产生的事件。
协处理器框架提供的接口如下:
- RegionObserver: 用户可以使用这种类型来处理数据修改事件,它们与表的region联系紧密
- MasterObserver: 可以用来处理与DDL类型相关的事件,这些事集群事件
- WALObserver: 提供控制WAL的钩子函数
- endpoint
除了事件处理,有时,用户需要将一些自定义事件放在服务器端运行,例如,做一些数据统计的工作,数据的原子合并工作。
endpoint通过添加一些远程过程调用来动态的扩展RPC协议。类似与RDBMS中的存储过程。
协处理器提供的接口如下:
- CoprocessorProtocol : 用户通过扩展这个接口,来添加一些自定义的行为
- Batch.Call:用户通过这个接口在客户端调用定义在CoprocessorProtocol协义中的方法
- < T extend CoprocessorProtocol> T coprocessorProxy(Class< T > protocol, byte[] row) : 通过HTable提供的这个方法,来处理单个region的处理,由于CoprocessorProtocol案例和表中单个region联系在一起,所以客户端的RPC调用必须定义region,这个region会在CoprocessorProtocol方法调用中被使用到。协处理Rpc调用会通过行键来查找涉及的region。
- < T extends CoprocessorProtocol, R> Map< byte[], R> coprocessorExec( Class< T > protocol, byte[] startKey, byte[] endKey, Batch.Call< T, R> callable): 表中包含在起始键和终止行键中的region都将作为RPC endpoint。
- < T extends CoprocessorProtocol , R> void coprocessorExec( Class< T > protocol, byte[] startKey, byte[] endKey, Batch.Call< T, R> callable, Batch.CallBack< R > callback): Batch类为CoprocessorProtocol中涉及多个region方法的调用提供了两个接口, 客户端实现Batch.Call接口来调用CoprocessorProtocol实例的方法。每个选中的region将调用一次这个接口的call方法,在调用完成时,客户端可以选择实现Batch.Callback来传回每次region调用的结果。
部署协处理器
协处理器有两种部署方式,一种是通过配置文件,在hbase启动时,加载自定义的协处理器,第二种是通过HBase的表描述符加载,在创建表的时候加载协处理。
配置文件方式
通过配置文件方式加载的协处理器是针对全局有效的,用户不能指定具体是那张表或哪个region加载这个协处理器。通过在hbase-site.xml中添加以下一条或几条来添加协处理器< property>
< name> hbase.coprocessor.region.classes< /name>
< value> coprocessor.RegionObserverExample, coprocessor.AnotherCoprocessor < /value>
< /property>
< property>
< name> hbase.coprocessor.master.classes< /name>
< value> coprocessor.MasterObserverExample < /value>
< /property>
< property>
< name> hbase.coprocessor.wal.classes< /name>
< value> coprocessor.WalObserverExample< /value>
< /property>从表描述符中加载
通过这种方式加载的协处理器是针对特定表的,用户只能在于region相关的协处理器上使用这种方法,而不能在master或WAL相关的协处理器上使用。用户需要在表描述符中通过HTableDescriptor.setValue()方法定义它们。键必须COPROCESSOR开头,值必须符合以下格式:< path-to-jar>|< classname>|< priority>
以下是定义两个协处理的例子:
‘COPROCESSOR$1’ => \
’ hdfs://localhost:8020/users/leon/test.jar|coprocessor.Test|SYSTEM ’
‘COPROCESSOR$2’ => \
‘/Users/laura/test2.jar|coprocessor.AnotherTest|USER’