0%

HBase协处理器

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
describe 'test'

卸载协处理器

1
alter 'test', METHOD => 'table_att_unset', NAME => 'coprocessor$1'

欢迎关注我的其它发布渠道