一、简述
http://hbase.apache.org/book.html#cp
Hbase 作为列族数据库最经常被人诟病的特性包括:
- 无法轻易建立“二级索引”
- 难以执 行求和、计数、排序等操作
比如,在旧版本的(<0.92)Hbase 中,统计数据表的总行数,需要使用 Counter 方法,执行一次 MapReduce Job 才能得到。虽然 HBase 在数据存储层中集成了 MapReduce,能够有效用于数据表的分布式计算。然而在很多情况下,做一些简单的相加或者聚合计算的时候, 如果直接将计算过程放置在 server 端,能够减少通讯开销,从而获 得很好的性能提升
- 于是, HBase 在 0.92 之后引入了协处理器(coprocessors),实现一些激动人心的新特性:能够轻易建立二次索引、复杂过滤器(谓词下推)以及访问控制等。
二、协处理器类型
2.1 Observer协处理器
Observer 类似于传统数据库中的触发器,当发生某些事件的时候这类协处理器会被 Server 端调用。Observer Coprocessor 就是一些散布在 HBase Server 端代码中的 hook 钩子, 在固定的事件发生时被调用。比如: put 操作之前有钩子函数 prePut,该函数在 put 操作执行前会被 Region Server 调用;在 put 操作之后则有 postPut 钩子函数。
1. 功能
通常可以用来实现下面功能:
- 权限校验:在执行 Get 或 Put 操作之前,您可以使用 preGet 或 prePut 方法检查权限;
- 完整性约束:HBase 不支持关系型数据库中的外键功能,可以通过触发器在插入或者删除数据的时候,对关联的数据进行检查;
- 二级索引:可以使用协处理器来维护二级索引。
2. 类型
当前 Observer 协处理器有以下四种类型:
RegionObserver
- 允许您观察 Region 上的事件,Get、 Put、 Delete、 Scan 等操作。
RegionServerObserver
- 允许您观察与 RegionServer 操作相关的事件,例如启动,停止或执行合并,提交或回滚。
MasterObserver
- 允许您观察与 HBase Master 相关的事件,例如表创建,删除或 schema 修改。
WalObserver
- 允许您观察与预写日志(WAL)相关的事件。
3. 接口
以上四种类型的 Observer 协处理器均继承自 Coprocessor 接口,这四个接口中分别定义了所有可用的钩子方法,以便在对应方法前后执行特定的操作。通常情况下,我们并不会直接实现上面接口,而是继承其 Base 实现类,Base 实现类只是简单空实现了接口中的方法,这样我们在实现自定义的协处理器时,就不必实现所有方法,只需要重写必要方法即可。
![](https://img.haomeiwen.com/i13587608/69393064c1c49f3c.png)
这里以 RegionObservers 为例,其接口类中定义了所有可用的钩子方法,下面截取了部分方法的定义,多数方法都是成对出现的,有 pre 就有 post:
![](https://img.haomeiwen.com/i13587608/30ce33b462c02633.png)
4. 执行流程
![](https://img.haomeiwen.com/i13587608/21af961d832d37e2.png)
- 1、客户端发起get请求
- 2、该请求被分派给合适的RegionServer和Region
- 3、coprocessorHost拦截该请求,然后在该表上登记的每个RegionObserer上调用preGet()
- 4、如果没有被preGet拦截,该请求继续送到Region,然后进行处理
- 5、Region产生的结果再次被coprocessorHost拦截,调用posGet()处理
- 6、加入没有postGet()拦截该响应,最终结果被返回给客户端
如果大家了解 Spring,可以将这种执行方式类比于其 AOP 的执行原理即可,官方文档当中也是这样类比的:
If you are familiar with Aspect Oriented Programming (AOP), you can think of a coprocessor as applying advice by intercepting a request and then running some custom code,before passing the request on to its final destination (or even changing the destination).
如果您熟悉面向切面编程(AOP),您可以将协处理器视为通过拦截请求然后运行一些自定义代码来使用 Advice,然后将请求传递到其最终目标(或者更改目标)。
2.2 Endpoint协处理器
-
Endpoint 协处理器类似传统数据库中的存储过程,客户端可以调用这些 Endpoint 协处理器执行一段 Server 端代码,并将 Server 端代码的结果返回给客户端进一步处理,最常见的用法就是进行聚集操作。
-
如果没有协处理器,当用户需要找出一张表中的最大数据,即max 聚合操作,就必须进行全表扫描,在客户端代码内遍历扫描结果,并执行求最大值的操作。这样的方法无法利用底层集群的并发能力,而将所有计算都集中到 Client 端统一执 行,势必效率低下。
-
利用 Coprocessor,用户可以将求最大值的代码部署到 HBase Server 端,HBase 将利用底层 cluster 的多个节点并发执行求最大值的操作。即在每个 Region 范围内 执行求最大值的代码,将每个 Region 的最大值在 Region Server 端计算出,仅仅将该 max 值返回给客户端。在客户端进一步将多个 Region 的最大值进一步处理而找到其中的最大值。这样整体的执行效率就会提高很多。
-
下图是 EndPoint 的工作原理:
总结
- Observer:允许集群在正常的客户端操作过程中可以有不同的行为表现。
- Endpoint:允许扩展集群的能力,对客户端应用开放新的运算命令。
- observer:类似于 RDBMS 中的触发器,主要在服务端工作。
- endpoint:类似于 RDBMS 中的存储过程,主要在 服务器端、client 端工作。
- observer:可以实现权限管理、优先级设置、监控、 ddl 控制、 二级索引等功能。
- endpoint:可以实现 min、 max、 avg、 sum、 distinct、 group by 等功能。
三、协处理的加载方式
协处理器的加载方式有两种:
- 静态加载方式( Static Load)
- 动态加载方式 ( Dynamic Load)
静态加载的协处理器称之为 System Coprocessor,动态加载的协处理器称 之为 Table Coprocessor。
3.1 静态加载
通过修改 hbase-site.xml 这个文件来实现
启动全局 aggregation,能过操纵所有的表上的数据。只需要添加如下代码:
<property>
<name>hbase.coprocessor.user.region.classes</name>
<value>org.apache.hadoop.hbase.coprocessor.AggregateImplementation</value>
</property>
为所有 table 加载了一个 cp class,可以用” ,”分割加载多个 class
3.2 动态加载
-
启用表 aggregation,只对特定的表生效
-
通过 HBase Shell 来实现,disable 指定表
hbase> disable 'mytable'
- 添加 aggregation
hbase> alter 'mytable', METHOD => 'table_att','coprocessor'=> >'|org.apache.Hadoop.hbase.coprocessor.AggregateImplementation||'
- 重启启用表
hbase> enable 'mytable'
3.3 协处理器卸载
只需三步:
disable ‘test’
alter ‘test’, METHOD => ‘table_att_unset’, NAME => ‘coprocessor$1’
enable ‘test’
参考:
https://blog.csdn.net/mxk4869/article/details/125613372
https://blog.csdn.net/CSDNGuoYuying/article/details/128831879
网友评论