HBase的协处理器

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 加载协处理器顺序:

  1. 配置文件加载(系统级别的):通过hbase-site.xml配置文件加载。
  2. shell 加载(表级别的): 通过alter 命令来对表进行schema修改来加载协处理器
  3. 通过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

动态加载

  1. 禁用表;
  2. 卸载协处理器;
  3. 重新指定协处理器;
  4. 激活表,即可。

hbase alter ‘users’, METHOD => ‘table_att’, ‘Coprocessor’=>‘hdfs://xxx:9200/
user/xxx/coprocessor.jar| xxx.xxx.RegionObserverExample|1073741823|
arg1=1,arg2=2’
解释:

  1. 文件路径:文件路径中需要包含Coprocessor的实现,并且对所有的RegionServer都是可达的。这个路径可以是每个RegionServer的本地磁盘路径,也可以是HDFS上的一个路径。如果是用路径来指定要加载的Coprocessor,这个路径下的所有jar文件都会被加载,不过该路径下的子目录中的jar不会被加载。
  2. 类名:Coprocessor的全限定类名。
  3. 优先级:一个整数。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;
  1. 参数(可选的):这些值会被传递给要使用的Coprocessor实现。这个项是可选的。

注意事项

重复加载Coprocessor

如果我们先静态加载了一个Coprocessor,而后又通过HBase Shell动态加载了一次这个Coprocessor。那么先加载的Coprocessor并不会被覆盖,而是会同时存在两个Coprocessor实例。第二个Coprocessor会有更低的优先级,换句话说,重复加载的第二个Coprocessor实例实际上没有发挥作用。 要卸载、更新,需要重启JVM,即RegionServer。

RegionCoprocessorHost的协处理器加载过程:

首先加载系统的协处理器,加载实际上就是把协处理器的环境放入一个set中
如果部署系统表的话就加载用户协处理器
最后从表描述中加载协处理器

猜你喜欢

转载自blog.csdn.net/m0_37039331/article/details/85062935