起源
HBase作为列族数据库最长被人诟病的特性包括:
- 无法轻易建立“二级索引”
- 难以执行求和、计数、排序等操作
比如,在旧版本(<0.92)HBase中,统计数据表的总行数,需要使用Counter方法,执行一次MapReduce Job才能得到。虽然HBase在数据存储层中集成了MapReduce,能够有效用于数据表的分布式计算。然而在很多情况下,做一些简单的相加或者聚合计算的时候,如果直接将计算过程放置在server端,能够减少通讯开销,从而获得很好的性能提升。
于是,HBase在0.92之后引入了协处理器(coprocessors),实现一些激动人心的新特性:能够轻易建立二次索引、复杂过滤器(谓词下推)以及访问控制等。
协处理器的主要分类
ObServer
- observer类似于传统数据库中的触发器,当发生某些事件的时候这类协处理器会被server端调用。observer coprocessor就是一些散布在HBase server端代码中的hook钩子,在固定的事件发生时被调用。比如:put操作之前就有钩子函数prePut,该函数在put操作执行之前会被Region Server调用;在put操作之后则有postPut钩子函数
- 以HBase2.0版本为例,它提供了三种观察者接口:
- RegionObserver:提供客户端的数据操纵事件的钩子:Get、Put、Delete、Scan等
- WALObserver:提供WAL相关操作的钩子。
- MaserObserver:提供DDL类型操作的钩子。如创建、删除、修改数据表等。
- 到0.96版本有新增一个RegionServerObserver
- 以HBase2.0版本为例,它提供了三种观察者接口:
- 下面以Region为例讲解Observer这种协处理器的原理
- 比如客户端发起get请求
- 该请求被分派给合适的RegionServer和Region
- coprocessorHost拦截该请求,然后在该表上登记的每个RegionObserver上调用preGet()
- 如果没有被preGet拦截,该请求继续发送到Region,然后进行处理
- Region产生的结果再次被coprocessorHost拦截,调用postGet()处理
- 假如没有postGet()拦截该响应,最终结果被返回给客户端
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中的存储过程,主要在服务端、客户端工作
- Observer可以实现权限管理、优先级设置、监控、DDL控制、二级索引等功能
- Endpoint可以实现min、max、avg、sum、distinct、group by等功能
加载方式
静态加载
-
通过修改
hbase-site.xml
这个文件实现 -
启动全局aggregation,能够操纵所有的表上的数据。只需要添加如下代码:
<property> <name>hbase.coprocessor.user.region.classes</name> <value>org.apache.hadoop.hbase.coprocessor.AggregateImplementatioin</value> </property>
注意:为所有table加载了一个cp class,可以用“,”分隔加载多个class
动态加载
-
启用表aggregation,只对特定的表生效
-
通过HBase Shell来实现,disable 禁用表
-
添加aggregation,添加后启用表即可
alter 'mytable', METHOD => 'table_att','coprocessor' => '|org.apache.Hadoop.hbase.coprocessor.AggregateImplementation||'
卸载方式
1)禁用表
disable 'test'
2)修改表:删除协处理器的配置信息
alter 'test',METHOD => 'table_att_unset', NAME => 'coprocessor$1'
3)启动表
enable 'test'