一文搞懂 HBase 的 Coprocessor
作者头像
  • 乌咪姐
  • 2019-11-06 07:53:43 2

HBase的Coprocessor是模仿谷歌BigTable的Coprocessor模型实现的,旨在提供一种机制,使得开发者可以直接在RegionServer上运行自定义代码来管理数据。

尽管Coprocessor为HBase提供了强大的功能,但使用它也存在一定的风险。由于Coprocessor的代码直接运行在RegionServer上并与数据直接交互,这可能导致数据损坏,例如“中间人攻击”和其他形式的恶意入侵。当前尚无有效的机制来防止由Coprocessor引起的数据损坏。此外,由于缺乏资源隔离,即使不是恶意设计但表现不佳的Coprocessor也可能严重影响集群的性能和稳定性。

传统上,我们访问HBase通常是通过Scan或Get获取数据,然后利用Filter过滤不需要的部分,最后在客户端进行业务运算。然而,在数据量巨大的情况下,比如一个包含数亿行和数十万列的数据集,使用传统的数据获取方式可能会在网络层面上遇到瓶颈。客户端也需要具备强大的计算能力和充足的内存来处理如此庞大的数据量,这使得客户端代码变得庞大且复杂。

在这种场景下,Coprocessor能够发挥重要作用。我们可以通过将业务运算代码封装到Coprocessor中,并在RegionServer上执行,从而在数据实际存储的位置进行运算,并将结果返回给客户端。

以下是Coprocessor如何发挥作用的一些实际应用示例:

触发器和存储过程:Observer Coprocessor类似于关系型数据库中的触发器,允许我们在特定事件(如Get或Scan)发生前后执行特定代码。Endpoint Coprocessor类似于关系型数据库中的存储过程,允许我们在RegionServer上直接对数据进行运算,而不是在客户端完成运算。

MapReduce:Coprocessor遵循与MapReduce相同的原理,即将计算任务移动到数据所在的位置。

面向切面编程(AOP):熟悉AOP概念的人可以把Coprocessor的执行过程视为在请求传递过程中拦截请求并执行自定义代码。

Coprocessor类型

Coprocessor主要分为两类:Observer Coprocessors(观察者)和Endpoint Coprocessors(终端)。

Observer Coprocessors

Observer Coprocessor会在特定事件发生之前或之后触发。事件发生前触发的Coprocessor需要重写带有“pre”前缀的方法,如prePut。事件发生后触发的Coprocessor使用带有“post”前缀的方法,如postPut。

Observer Coprocessor的应用场景包括: - 安全性:在执行Get或Put操作前,通过preGet或prePut方法检查是否允许该操作。 - 引用完整性约束:HBase不直接支持关系型数据库中的引用完整性约束,但可以通过Coprocessor增强这种约束。例如,每次向user表写入数据时,同时向userdailyattendance表插入相应记录,可以通过Coprocessor实现这一需求。 - 二级索引:可以使用Coprocessor维护二级索引。

根据作用对象的不同,Observer Coprocessor包括RegionObserver、RegionServerObserver、MasterObserver和WalObserver。这些Observer可以用来处理它们观察对象的操作,例如通过RegionObserver处理与Region相关的操作,如Get和Put操作。

Endpoint Coprocessors

Endpoint Coprocessor允许开发者在数据本地执行运算。例如,对于一个包含数百个Region的表,可以计算其运行平均值或总和。

在Observer Coprocessor中,代码执行相对透明,而Endpoint Coprocessor需要显式调用Table、HTableInterface或HTable中的CoprocessorService()方法才能执行。

从0.96版本开始,HBase采用了Google的Protobuf。这在一定程度上影响了Endpoint Coprocessor的开发。Endpoint Coprocessor应尽量避免使用HBase外部成员,而是依赖公共API,理想情况下仅依赖接口和数据结构。这样可以使开发的Endpoint Coprocessor更加健壮,不受HBase内核演进的影响。私有或正在演化的HBase外部API在删除前无需严格遵守弃用规则或Java通用规则。而使用Protobuf生成的文件不受这些注释的影响,因为它们是由Protobuf工具自动生成的。在生成这些文件时,Protobuf工具并不知道也不考虑HBase的工作原理。

    本文来源:图灵汇
责任编辑: : 乌咪姐
声明:本文系图灵汇原创稿件,版权属图灵汇所有,未经授权不得转载,已经协议授权的媒体下载使用时须注明"稿件来源:图灵汇",违者将依法追究责任。
    分享
一文CoprocessorHBase
    下一篇