一、协处理器是什么
协处理器是HBase提供的允许我们在regionserver上运行我们自己编写的代码的框架。
二、协处理器的介绍
Hbase主要为我们提供了两类协处理器:observer和endpoint。
observer:
observer类协处理器类似于数据库中的触发器(官网上是这么说的)。然而,我个人觉得更像是一种拦截器,为什么这么说呢?我们可以来看一下这类协处理器提供的方法:
RegionObserver提供的方法
1 preOpen, postOpen: Called before and after the region is reported as online to the master. 2 preFlush, postFlush: Called before and after the memstore is flushed into a new store file. 3 preGet, postGet: Called before and after a client makes a Get request. 4 preExists, postExists: Called before and after the client tests for existence using a Get. 5 prePut and postPut: Called before and after the client stores a value. 6 preDelete and postDelete: Called before and after the client deletes a value. 7 etc.
MasterObserver提供的方法
preCreateTable/postCreateTable: Called before and after the region is reported as online to the master. preDeleteTable/postDeleteTable etc.
WALObserver提供的方法
preWALWrite/postWALWrite: called before and after a WALEdit written to WAL.
这些方法都是以pre或post开头,并且成对出现。非常类似拦截器。
so,我们在用的时候,可以当做拦截器来使用,比如
1.权限控制
当客户端发起请求要put、get时,我们可以通过对应的preput、preget方法来检验客户端是否有权限,特别是客户端发送的请求是delete、deleteTable之类的。
2.构建二级索引
当客户端发起put请求往HBase中插入数据时,我们可以利用postput方法,在插入之后为数据建索引,这个网上也有相关的例子
https://blog.csdn.net/nuoyahadili8/article/details/51088345
3.防止region的自动拆分
这个功能,我们可以重写RegionObserver提供的preSplit方法,在该方法中,使用observerContext的bypass()方法来停止region的分裂
@override public void preSplit(ObserverContext<RegionCoprocessorEnvironment> e){ e.bypass(); }
当然,observer还提供了更多的方法让我们调用,这里就不展开介绍了,具体可以看HBase权威指南中的关于协处理器的介绍
endpoint
假如有这样一个需求,我们需要计算一个table中具体某一列的所有值的和的时候,而这张表是一张大表,有1000个region。此时,如果我们使用普通的api,我们需要将该表的每一行的这一列的值都获取到,再来计算和。这样等于是全表遍历,效率低下。
这时,我们可以通过继承BaseEndpointCoprocessor类并实现CoprocessorProtocol接口来编写计算总和的协处理器。并让regionserver加载这个endpoint,就可以使这张大表的1000个region在各自的regionserver上计算和。最终得到1000个和返回个客户端。
在客户端,我们只需要将1000个数相加就可以得到综合了。
这样做的好处是计算过程在服务器端,而客户端接收到的只是1000个中间结果,减少了网络资源的开销,加快了计算结果。
当然,要让endpoint可以被regionserver加载,我们需要在hbase-site.xml中做相应的配置,并重启HBase。
三、协处理器的使用
协处理器需要我们自定义编写代码,而一旦我们的编码出现问题,可能导致HBase的奔溃。具体的使用及采坑记录可以参考以下网址
https://www.jianshu.com/p/d56584c45401