HBase协处理器
HBase 协处理器:在 RegionServer 上跑自定义代码,实现触发器、存储过程和二级索引
HBase 原生不支持触发器、不支持存储过程、不支持二级索引。但协处理器可以补上这些缺口。
协处理器是运行在 RegionServer 上的用户自定义代码——数据在哪儿,计算就在哪儿,不用把数据拉到客户端再算。
两种类型:
| 类型 | 类比 | 触发方式 |
|---|---|---|
| Observer | 数据库触发器 | 事件驱动(写数据前、写数据后、读数据时) |
| Endpoint | 存储过程 | 主动调用(客户端发 RPC 到 RegionServer) |
Observer:事件触发,自动执行
Observer 在特定事件发生时自动执行,适合”顺便做点事”的场景。
三种 Observer:
| 类型 | 监听什么 | 典型用途 |
|---|---|---|
RegionObserver |
Region 上的读写操作(Put/Get/Delete/Scan) | 写入校验、二级索引同步、数据脱敏 |
MasterObserver |
Master 上的 DDL 操作(建表/删表/改表) | 权限校验、操作审计 |
WALObserver |
WAL 日志写入事件 | 日志加密、自定义存储 |
一个最简单的 RegionObserver:在 Put 之后打印 RowKey
import org.apache.hadoop.hbase.Coprocessor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.coprocessor.*;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.wal.WALEdit;
import java.io.IOException;
import java.util.Optional;
// 实现 RegionCoprocessor 和 RegionObserver 接口
public class RegionObserverExample implements RegionCoprocessor, RegionObserver {
// 返回当前类作为 RegionObserver 实例
public Optional<RegionObserver> getRegionObserver() {
return Optional.of(this); // 必须返回当前实例,否则无法触发
}
// 重写 postPut 方法:数据写入后执行
public void postPut(
ObserverContext<RegionCoprocessorEnvironment> c,
Put put,
WALEdit edit,
Durability durability
) throws IOException {
// 从 Put 对象中获取 RowKey 并打印
String rowKey = Bytes.toString(put.getRow());
System.out.println("[PostPut] 写入的 RowKey: " + rowKey);
}
}
常用 Observer 钩子方法:
| 方法 | 触发时机 |
|---|---|
prePut |
写入前(可做校验,抛异常可阻止写入) |
postPut |
写入后(做索引同步等) |
preGet |
查询前 |
postGet |
查询后 |
preDelete |
删除前 |
postDelete |
删除后 |
Endpoint:主动调用,服务端计算
Endpoint 是”存储过程”——客户端主动调用,在 RegionServer 上执行自定义逻辑,只把结果返回给客户端。
典型场景: 统计一张表有多少行数据。如果用客户端扫全表,数据量大的时候网络传输巨大。用 Endpoint 在服务端计数,只返回一个数字。
Endpoint 实现步骤(简版):
- 定义协议接口(继承
CoprocessorProtocol) - 实现服务端逻辑
- 客户端通过
Table.coprocessorService()调用
抽象理解:



