HBase的协处理器(Compressor)

起源

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
  • 下面以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'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值