hbase实际之协处理器Coprocessor
作者头像
  • 2019-11-06 17:55:19 7

HBase客户端查询的优势与局限

在HBase中,使用ScanGet查询数据,可以通过Filter来筛选特定的数据。这种方式适用于数据量较小的情况,例如几千行数据以及不太多的列。

然而,当表的数据量达到数亿行甚至数百万列时,网络传输大量的数据会导致网络拥堵。此外,客户端需要足够的内存来处理这些数据,并且客户端代码也会变得庞大且复杂。

解决方案

为了优化这种情况,应该将计算任务转移到数据所在的位置,而不是移动数据本身。这种思路可以通过使用Coprocessor实现。

什么是Coprocessor?

Coprocessor是一个框架,可以方便地在Region Server上运行自定义的业务逻辑代码。

Coprocessor 类比

  • 触发器和存储过程:Observer Coprocessor类似于RDBMS中的触发器,而EndPoint Coprocessor类似于RDBMS中的存储过程。
  • 面向切面编程:Coprocessor的工作原理类似于AOP(面向切面编程)。它可以在请求到达最终目的地之前拦截请求,并执行相应的代码。

Coprocessor 的分类

Observer Coprocessor

Observer Coprocessor在特定事件发生前后触发。在事件发生前,可以通过重写带有pre前缀的方法(如prePut)来触发;在事件发生后,则可以通过带有post前缀的方法(如postPut)来触发。

EndPoint

EndPoint是一种远程RPC调用,类似于Web服务调用,但它不使用XML,而是使用序列化框架(如protobuf)来减少数据大小。

Observer Coprocessor 的应用场景与实现

安全性

在执行Get或Put操作前,可以通过preGetprePut方法检查是否允许该操作。

引用完整性约束

虽然HBase不直接支持关系型数据库中的外键约束,但可以通过Coprocessor增强这种约束。例如,每当向user表中插入一条记录时,也可以向userdailyattendance表中插入一条相应的记录。

二级索引

Coprocessor还可以用来维护一个二级索引,但这部分内容将在以后详细讨论。

Observer Coprocessor 的类型

Observer Coprocessor主要分为四种类型,它们都继承自Coprocessor接口:

  • RegionObserver:针对Region的操作(如Region的打开、关闭、刷新、合并等)
  • RegionServerObserver:针对RegionServer的操作(如Region的合并、分裂、日志回滚等)
  • MasterObserver:针对Master的操作(如表的创建、删除、Region的移动、拆分等)
  • WALObserver:针对WAL的操作(如日志的写入)

EndPoint 的应用场景与实现

动态RPC协议

Endpoint允许定义自定义的动态RPC协议,以便客户端与Region Server进行通信。由于Coprocessor与Region Server运行在同一进程空间内,因此可以在Region端定义自己的方法,从而减少网络传输开销,提升HBase性能。

工作流程

  1. 在Client端执行CoprocessorExec()调用,对应的RPC方法会在每个Region中执行。
  2. 结果返回给客户端。

实现步骤

  1. 创建.proto文件定义服务。
  2. 使用protoc命令生成Java代码。
  3. 编写一个Coprocessor类,实现Coprocessor和CoprocessorService接口,并实现接口中定义的方法。
  4. 编写客户端代码调用Coprocessor。

Coprocessor 的加载方式

静态加载

  • hbase-site.xml中创建记录。
  • 将代码放置在HBase的类路径下。
  • 重启HBase。

动态加载

  • 动态加载不需要重启HBase,但只对特定表有效。
  • 动态加载需要对表进行离线操作。
  • 可以通过HBase Shell或Java API动态加载和卸载Coprocessor。

Coprocessor 的潜在风险

Coprocessor是一项高级功能,直接在Region Server上运行,并直接访问数据,这可能导致数据损坏的风险,例如中间人攻击或其他类型的恶意入侵。目前尚无机制防止这种数据损坏。此外,缺乏资源隔离也可能导致性能下降。

其他公司的实践案例

滴滴公司在使用HBase方面有着丰富的经验,他们的实践技巧值得借鉴。

二级索引的设计

Phoenix的Salting功能虽然有效,但对延迟有较大影响。因此,如果对延迟要求较高,可以考虑使用reverse函数将主键列散列,同时使用Function Index来减少查询延迟。

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