产生背景
- Hbase作为列族数据库最经常被人诟病的特性包括:无法轻易建立“二级索引”,难以执行求和、计数、排序等操作。
- 比如,在旧版本的(<0.92)Hbase中,统计数据表的总行数,需要使用 Counter 方法,执行一次 MapReduce Job 才能得到。
- 虽然 HBase在数据存储层中集成了 MapReduce,能够有效用于数据表的分布式计算。然而在很多情况下,做一些简单的相加或者聚合计算的时候,如果直接将计算过程放置在 server 端,能够减少通讯开销,从而获得很好的性能提升。
- 于是,HBase 在 0.92之后引入了协处理器(coprocessors),实现一些激动 人心的新特性:能够轻易建立二次索引、复杂过滤器(谓词下推)以及访问控制等。
协处理器(Coprocessor)分类
-
Observer
-
这一类协处理器与触发器(trigger)类似:回调函数(也被称作钩子函数,hook)在一些特定事件发生时被执行。这些事件包括一些用户产生的事件,也包括服务器端内部自动产生的事件。
-
协处理器框架提供的接口如下:
-
RegionObserver:
- 用户可以用这种的处理器处理数据修改事件,它们与表的region联系紧密。
-
MasterObserver:
- 可以被用作管理或DDL类型的操作,这些是集群级事件。
-
WALObserver:
- 提供控制WAL的挂钩函数
-
Observer提供了一些设计好的回调函数,每个操作在集群服务器端都可以被调用。
-
-
Endpoint
-
除了事件处理之外还需要将用户自定义操作添加到服务器端。用户代码可以被部署到管理数据的服务器端,例如,做一些服务器端计算的工作。
-
Endpoint通过添加一下远程过程调用来动态扩展RPC协议。可以把它们理解为与RDBMS中类似的存储过程。
-
客户端可以调用这些 Endpoint 协处理器执行一段 Server端代码,并将Server 端代码的结果返回给客户端进一步处理,最常见的用法就是进行聚集操作(谓词下推)。
-
Endpoint可以与observer的实现组合起来直接作用于服务器端的状态。
-
-
Observer 与 Endpoint总结
-
两种协处理器的区别:
- observer 类似于 RDBMS 中的触发器,主要在服务端工作
- endpoint 类似于 RDBMS 中的存储过程,主要在服务端工作
- Observer 允许集群在正常的客户端操作过程中可以有不同的行为表现 Endpoint 允许扩展集群的能力,对客户端应用开放新的运算命令
- observer 可以实现权限管理、优先级设置、监控、ddl 控制、二级索引等功能 endpoint 可以实现min、max、avg、sum、distinct、group by 等功能
-
-
协处理器加载方式
-
协处理器的加载方式有两种:
-
静态加载方式(Static Load)
- 静态加载的协处理器称之为 System Coprocessor -
动态加载方式 (Dynamic Load)
- 动态加载的协处理器称 之为 Table Coprocessor -
静态加载
-
通过修改 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。
-
但由于该方法是全局的,所以在实际应用中并不是很多,而动态加载用的更多一些。
-
-
动态加载
-
启用表 aggregation,只对特定的表生效。通过 HBase Shell 来实现。
-
disable 指定表
```sh hbase> disable 'table名'; ```
- 添加 aggregation
```sh hbase> alter 'mytable', METHOD => 'table_att','coprocessor'=> '(1) org.apache.Hadoop.hbase.coprocessor.AggregateImplementation(2)(3)(4)' ``` - 参数解释: - (1): jar包位置 hdfs的路径 - (2): jar包的协处理器的权限定名 - (3): 协处理器的优先级别( 同一个表中添加多个协处理器,优先级问题 使用数字表示,数字越大代表优先级越高 ) - (4): 代码中程序的参数,没有不传
- 重启指定表
```sh hbase> enable 'table名'; ```
-
-
协处理器卸载
-
禁用表
disable 'mytable'
-
卸载
alter 'mytable',METHOD=>'table_att_unset',NAME=>'coprocessor$1'
-
启用表
enable 'mytable'
-
-
-
协处理器查询加盐之后的表
-
由于每个Region中其实是有Start Key 和 End Key的, 它们是由我们所创建的表指定的, 而协处理器的代码其实是在每个Region中执行的。
-
这些代码在Region里面执行的时候是可以拿到当前Region的信息的, 包括了Start Key 和 End Key。
-
我们只要将拿到的Start Key 信息和查询的 UID 进行拼接, 这样就可以查询到我们要的数据。
-