HBase协处理器
协处理器允许用户在region服务器上运行自己的代码,实现了相当于触发器的功能。如可以使用协处理器在进行hbase操作时将数据同步到es
协处理器提供了两类协处理器observer和endpoint
- observer 这一类协处理器与触发器类似,在一些特定事件发生时被执行。包含接口如下
- RegionObserver 可以使用这种处理器处理数据修改事件,与表的region联系紧密
- MasterObserver 可以用作管理或DDL类型的操作,属于集群级事件
- WALObserver 提供控制WAL的钩子函数
- endpoint 通过添加一些远程过程调用来动态扩展RPC协议,可以理解为类似于存储过程
小示例
最简单的协处理器,就是输出一下rowkey
1 2 3 4 5 6 7 8 9 10 11 12
| public class RegionObserverExample implements RegionCoprocessor, RegionObserver {
@Override public Optional<RegionObserver> getRegionObserver() { return Optional.of(this); }
@Override public void postPut(ObserverContext<RegionCoprocessorEnvironment> c, Put put, WALEdit edit, Durability durability) throws IOException { System.out.println(Bytes.toString(put.getRow())); } }
|
加载方式
hbase如何加载协处理器呢?可分为静态加载和动态加载
静态加载
静态加载可以使用配置文件
配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <property> <name>hbase.coprocessor.region.classes</name> <value>com.example.RegionObserverExample</value> </property> <property> <name>hbase.coprocessor.master.classes</name> <value>com.example.MasterObserverExample</value> </property> <property> <name>hbase.coprocessor.wal.classes</name> <value>com.example.WALObserverExample</value> </property>
|
将对应的jar包放到hbase的lib目录下,之后重启hbase
动态加载
由于静态加载每次都需要重启hbase,对于线上环境来说这种行为肯定是不允许的,可以使用动态加载来进行,不需要重启hbase
针对某个表来进行加载
1 2 3 4 5
| # 'coprocessor' => ①|②|③|④' # ① 协处理器jar包路径|②协处理器完整类名|③协处理器优先级|④传递给协处理器的参数 alter 'test', METHOD => 'table_att', 'Coprocessor'=>'hdfs://<namenode>:<port>/ user/<hadoop-user>/coprocessor.jar| com.example.RegionObserverExample|1073741823| arg1=1,arg2=2'
|
校验是否加载
卸载协处理器
1
| alter 'test', METHOD => 'table_att_unset', NAME => 'coprocessor$1'
|