写点什么

HBase 的协处理器详细剖析

  • 2021 年 11 月 25 日
  • 本文字数:1912 字

    阅读完需:约 6 分钟

1. 起源

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


比如,在旧版本的(<0.92)Hbase 中,统计数据表的总行数,需要使用 Counter 方法,执行一次 MapReduce Job 才能得到。


虽然 HBase 在数据存储层中集成了 MapReduce,能够有效用于数据表的分布式计算。然而在很多情况下,做一些简单的相加或者聚合计算的时候, 如果直接将计算过程放置在 server 端,能够减少通讯开销,从而获得很好的性能提升。于是, HBase 在 0.92 之后引入了协处理器(coprocessors),实现一些激动人心的新特性:能够轻易建立二次索引、复杂过滤器(谓词下推)以及访问控制等。

2. 协处理器有两种: observer 和 endpoint

1) observer 协处理器

Observer 类似于传统数据库中的触发器,当发生某些事件的时候这类协处理器会被 Server 端调用。


Observer Coprocessor 就是一些散布在 HBase Server 端代码中的 hook 钩子,在固定的事件发生时被调用。


比如: put 操作之前有钩子函数 prePut,该函数在 put 操作执行前会被 Region Server 调用;在 put 操作之后则有 postPut 钩子函数。


以 HBase0.92 版本为例,它提供了三种观察者接口:


  • RegionObserver:提供客户端的数据操纵事件钩子: Get、 Put、 Delete、 Scan 等。

  • WALObserver:提供 WAL 相关操作钩子。

  • MasterObserver:提供 DDL-类型的操作钩子。如创建、删除、修改数据表等。


到 0.96 版本又新增一个 RegionServerObserver


下图是以 RegionObserver 为例子讲解 Observer 这种协处理器的原理:


2) endpoint 协处理器

Endpoint 协处理器类似传统数据库中的存储过程,客户端可以调用这些 Endpoint 协处理器执行一段 Server 端代码,并将 Server 端代码的结果返回给客户端进一步处理,最常见的用法就是进行聚集操作。


如果没有协处理器,当用户需要找出一张表中的最大数据,即 max 聚合操作,就必须进行全表扫描,在客户端代码内遍历扫描结果,并执行求最大值的操作。这样的方法无法利用底层集群的并发能力,而将所有计算都集中到 Client 端统一执行,势必效率低下。


利用 Coprocessor,用户可以将求最大值的代码部署到 HBase Server 端,HBase 将利用底层 cluster 的多个节点并发执行求最大值的操作。即在每个 Region 范围内 执行求最大值的代码,将每个 Region 的最大值在 Region Server 端计算出,仅仅将该 max 值返回给客户端。在客户端进一步将多个 Region 的最大值进一步处理而找到其中的最大值。这样整体的执行效率就会提高很多。


下图是 EndPoint 的工作原理:


3. 协处理器加载方式

协处理器的加载方式有两种,我们称之为静态加载方式( Static Load)和动态加载方式( Dynamic Load)。


静态加载的协处理器称之为 System Coprocessor


动态加载的协处理器称之为 Table Coprocessor。

1) 静态加载

通过修改 hbase-site.xml 这个文件来实现, 启动全局 aggregation,能过操纵所有的表上的数据。只需要添加如下代码:


<property><name>hbase.coprocessor.user.region.classes</name><value>org.apache.hadoop.hbase.coprocessor.AggregateImplementation</value></property>
复制代码

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'
复制代码


协处理器卸载


disable 'mytable'alter 'mytable', METHOD => 'table_att_unset',NAME=>'coprocessor$1'enable 'test'
复制代码

HBase 当中的二级索引的简要介绍

由于 HBase 的查询比较弱,如果需要实现类似于 select name,salary,count(1),max(salary) from user group by name,salary order by salary 等这样的复杂性的统计需求,基本上不可能,或者说比较困难,所以我们在使用 HBase 的时候,一般都会借助二级索引的方案来进行实现。


HBase 的一级索引就是 rowkey,我们只能通过 rowkey 进行检索。如果我们相对 hbase 里面列族的列列进行一些组合查询,就需要采用 HBase 的二级索引方案来进行多条件的查询。


1. MapReduce 方案 2. ITHBASE(Indexed-Transanctional HBase)方案 3. IHBASE(Index HBase)方案 4. Hbase Coprocessor(协处理器)方案 5. Solr+hbase 方案 6. CCIndex(complementalclustering index)方案


常见的二级索引我们一般可以借助各种其他的方式来实现,例如 Phoenix 或者 solr 或者 ES 等。


参考文档:

  1. 美团数据平台及数仓建设实践,超十万字总结

  2. 上百本优质大数据书籍,附必读清单(大数据宝藏)

  3. 五万字 | 耗时一个月整理出这份Hadoop吐血宝典

发布于: 7 小时前阅读数: 5
用户头像

InfoQ签约作者 2020.11.10 加入

文章首发于公众号:五分钟学大数据。大数据领域原创技术号,深入大数据技术

评论

发布
暂无评论
HBase 的协处理器详细剖析