内容简介
一、协处理的基本概念
- 使用客户端的API,配合过滤器可以对数据进行限制,使得返回客户端的数据更加精确。如果更近一步,将数据的某些处理流程直接放到服务端执行,然后仅仅返回一个小的处理结果集,类似于在服务端开启一个小型的MapReduce作业来分布式处理数据,这就是HBase的协处理器机制。
- 协处理器允许用户在region服务器执行自己的代码,即在允许用户执行region级别的操作。协处理器分为两大类:observer与endpoint。observer类似于关系型数据库中的触发器,endpoint则类似于关系型数据库中的存储过程,简单理解就是observer是一个观察者,当某些行为比如插入数据发生或者结束时,可以对应做出何种行为,属于被动调用,而endpoint则类似于调用一个函数,或者自定义的代码,属于主动调用。
- observer分为三类:
(1).RegionObserver:用户可以利用这种协处理器处理数据修改事件,与表的region紧密相连,是针对表数据做出修改时的协处理器。
(2).MasterObserver:可以被用于管理或DDL类型的操作,比如创建、修改表属性等,这是针对集群事件的协处理器。
(3).WALObserver:供控制WAL的钩子函数。
不同的observer提供了针对本observer的回调函数,供不同的事件进行回调。 - endpoint:除了事件处理之外,有时候还需要将用户的自定义操作添加到服务端,endpoint通过远程过程调用来扩展RPC协议,与关系型数据库的存储过程功能相似。
二、基于协处理器的行为表操作行为监控
0.实战内容与思路
- 本次案例HBase版本是hbase-1.2.0-cdh5.7.0,Hadoop版本是hadoop-2.6.0-cdh5.7.0 开发工具是IDEA2018。
- 实战内容:在操作HBase的表的过程中,可以对某些操作,比如put,get操作进行监控,一旦发生了此类的行为,就把操作该行为的时间、操作的表名以及操作行为所涉及的RowKey记录到一个HDFS上的文件上。
- 自定义一个类来继承BaseRegionObserver类,此类已经实现了所有的有关Region级别的所有方法,如果直接实现RegionObserver接口则要实现接口里面的所有方法,非常多,默认情况下继承BaseRegionObserver类没有任何的功能,用户则可以找对应要使用的方法进行重写就可以了。然后将代码打包并提交到HBase的集群中,最后配置HBase并重启即可。
1.在HBase中创建两张表用于测试
- 在Linux终端输入命令
hbase shell
进入HBase的终端。执行命令create 'table1','info'
来创建一张表名为table1,列族为info的表,再执行命令create 'table2','info'
来创建一张表名为table1,列族为info的表:
2. 创建普通的Java工程引入Maven支持
- 完整Maven依赖如下:
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> <hadoop.version>2.6.0-cdh5.7.0</hadoop.version> <hbase.version>1.2.0-cdh5.7.0</hbase.version> </properties> <repositories> <repository> <id>cloudera</id> <url>https://repository.cloudera.com/artifactory/cloudera-repos</url> </repository> </repositories> <dependencies> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-client</artifactId> <version>${ hbase.version}</version> </dependency> <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-server</artifactId> <version>${ hbase.version}</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>${ hadoop.version}</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId>