HBase中的协处理器有两种:observer和endpoint
Observer coprocessor:类似于RDBMS中的触发器,它在特定事件(例如Get或Put)发生之前或之后执行你的代码。
Endpoint coprocessor:类似于RDBMS中的存储过程,它允许你在RegionServer本身的数据执行自定义计算,而不是在客户端。
RegionServerObserver:主要针对region的管理的,比如merge,writeWAL等。
RegionObserver:主要针对client端对region上的数据操作,比如get,put,delete,batchMutate等。
MasterObserver:主要针对对HMaster操作。比如CreateTable,DeleteTable,ModifyTable,AddColumn等。
WALObserver :针对WAL的观察者(日志写)。
协处理器主要是在对应的CoprocessorHost中被调用。比如RegionObserver在RegionCoprocessorHost中被调用。
CoprocessorEnvironment: 主要是提供了协处理器的环境信息,提供版本信息,协处理器的优先信息,协处理器的对应表,协处理器的序号是按照最初加载时顺序指定的,在之后的执行过程中也会按照这个序号进行,一个Coprocessor对应着一个环境CoprocessorEnvironment。
加载协处理器:
Hbase 加载协处理器顺序:
- 配置文件加载(系统级别的):通过hbase-site.xml配置文件加载。
- shell 加载(表级别的): 通过alter 命令来对表进行schema修改来加载协处理器
- 通过API代码加载:API
协处理器加载方式:
静态加载:
1.hbase-site.xml中配置属性:
通过hbase.coprocessor.region.classes 配置 RegionObservers 和 Endpoints.
通过hbase.coprocessor.wal.classes 配置 WALObservers.
通过hbase.coprocessor.master.classes 配置MasterObservers.
value 必须写类的全名。
例子:
<property>
<name>hbase.coprocessor.region.classes</name>
<value>org.xxx.hbase.coprocessor.endpoint.xxx</value>
</property>
如果加载多个类,需要用逗号分隔,该框架使用默认的类加载器来加载配置的类,所以这些jar包必须在HBase的classpath中。
以这种方式加载的协处理器将在所有表的所有region中活动。这些也被称为系统协处理器。
列表中的第一个协处理器将会分配一个优先级Coprocessor.Priority.SYSTEM,之后的递增加1。当调用注册的观察者时,框架会按照优先顺序执行它们的回调方法。
2.将jar包放入HBase的lib目录下
3.重启HBase
动态加载
- 禁用表;
- 卸载协处理器;
- 重新指定协处理器;
- 激活表,即可。
hbase alter ‘users’, METHOD => ‘table_att’, ‘Coprocessor’=>‘hdfs://xxx:9200/
user/xxx/coprocessor.jar| xxx.xxx.RegionObserverExample|1073741823|
arg1=1,arg2=2’
解释:
- 文件路径:文件路径中需要包含Coprocessor的实现,并且对所有的RegionServer都是可达的。这个路径可以是每个RegionServer的本地磁盘路径,也可以是HDFS上的一个路径。如果是用路径来指定要加载的Coprocessor,这个路径下的所有jar文件都会被加载,不过该路径下的子目录中的jar不会被加载。
- 类名:Coprocessor的全限定类名。
- 优先级:一个整数。HBase将会使用优先级来决定在同一个位置配置的所有Observer Coprocessor的执行顺序。这个位置可以留白,这样HBase将会分配一个默认的优先级。
@see Coprocessor
/** Highest installation priority */
int PRIORITY_HIGHEST = 0;
/** High (system) installation priority */
int PRIORITY_SYSTEM = Integer.MAX_VALUE / 4;
/** Default installation priority for user coprocessors */
int PRIORITY_USER = Integer.MAX_VALUE / 2;
/** Lowest installation priority */
int PRIORITY_LOWEST = Integer.MAX_VALUE;
- 参数(可选的):这些值会被传递给要使用的Coprocessor实现。这个项是可选的。
注意事项
重复加载Coprocessor
如果我们先静态加载了一个Coprocessor,而后又通过HBase Shell动态加载了一次这个Coprocessor。那么先加载的Coprocessor并不会被覆盖,而是会同时存在两个Coprocessor实例。第二个Coprocessor会有更低的优先级,换句话说,重复加载的第二个Coprocessor实例实际上没有发挥作用。 要卸载、更新,需要重启JVM,即RegionServer。
RegionCoprocessorHost的协处理器加载过程:
首先加载系统的协处理器,加载实际上就是把协处理器的环境放入一个set中
如果部署系统表的话就加载用户协处理器
最后从表描述中加载协处理器