HBase的协处理器

在这里插入图片描述

起源

  • Hbase 作为列族数据库最经常被人诟病的特性包括:
    • 无法轻易建立“二级索引”
    • 难以执 行求和、计数、排序等操作

比如,在旧版本的(<0.92)Hbase 中,统计数据表的总行数,需要使用 Counter 方法,执行一次 MapReduce Job 才能得到。虽然 HBase 在数据存储层中集成了 MapReduce,能够有效用于数据表的分布式计算。然而在很多情况下,做一些简单的相加或者聚合计算的时候, 如果直接将计算过程放置在 server 端,能够减少通讯开销,从而获 得很好的性能提升。

于是, HBase 在 0.92 之后引入了协处理器(coprocessors),实现一些激动人心的新特性:能够轻易建立二次索引、复杂过滤器(谓词下推)以及访问控制等。

协处理器有两种: observer 和 endpoint

observer协处理器

  • Observer 类似于传统数据库中的触发器,当发生某些事件的时候这类协处理器会被 Server 端调用。Observer Coprocessor 就是一些散布在 HBase Server 端代码中的 hook 钩子, 在固定的事件发生时被调用。比如: put 操作之前有钩子函数 prePut,该函数在 put 操作执行前会被 Region Server 调用;在 put 操作之后则有 postPut 钩子函数

  • 以 Hbase2.0.0 版本为例,它提供了三种观察者接口:

    • RegionObserver:提供客户端的数据操纵事件钩子: Get、 Put、 Delete、 Scan 等
    • WALObserver:提供 WAL 相关操作钩子。
    • MasterObserver:提供 DDL-类型的操作钩子。如创建、删除、修改数据表等。
    • 到 0.96 版本又新增一个 RegionServerObserver下图是以 RegionObserver 为例子讲解 Observer 这种协处理器的原理:

在这里插入图片描述

  1. 客户端发起get请求
  2. 该请求被分派给合适的RegionServer和Region
  3. coprocessorHost拦截该请求,然后在该表上登记的每个RegionObserer上调用preGet()
  4. 如果没有被preGet拦截,该请求继续送到Region,然后进行处理
  5. Region产生的结果再次被coprocessorHost拦截,调用posGet()处理
  6. 加入没有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 中的存储过程,主要在 服务器端、client 端工作
  • observer 可以实现权限管理、优先级设置、监控、 ddl 控制、 二级索引等功能
  • endpoint 可以实现 min、 max、 avg、 sum、 distinct、 group by 等功能

协处理器加载方式

协处理器的加载方式有两种:

  • 静态加载方式( Static Load)
  • 动态加载方式 ( Dynamic Load)

静态加载的协处理器称之为 System Coprocessor,动态加载的协处理器称 之为 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 指定表
disable 'mytable'
  • 添加 aggregation
alter 'mytable', METHOD => 'table_att','coprocessor'=>
'|org.apache.Hadoop.hbase.coprocessor.AggregateImplementation||'
  • 重启启用表
enable 'mytable'

协处理器卸载

只需三步:

disable ‘test’
alter ‘test’, METHOD => ‘table_att_unset’, NAME => ‘coprocessor$1’
enable ‘test’
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值