HBase2.0 Observer的一些改动

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
云原生多模数据库 Lindorm,多引擎 多规格 0-4节点
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介:

最近需要把一个1.x的Observer移植到HBase2.0,发现2.0里面Observer接口和1.x相比还是有不少不一样的地方。所以简单在JIRA里面看了一下,把遇到的几个改动点的来龙去脉看了一下。从log来看,2.0里面Observer的调整还是比较多的,有一些是和其他特性相关联的改动,一篇文章很难整理的全面,所以这里只列出我遇到的一些改动。相信这些问题会有一定的代表性。


HBASE-17732 Coprocessor Design Improvements

https://issues.apache.org/jira/browse/HBASE-17732

在这个issue里面针对1.x里面coprocessor存在的一些问题,对coprocessor的设计做了大的调整。大部分的调整都不涉及接口,但是由于把Coprocessor和Observer之间的继承关系改成了组合关系,所以coprocessor的代码需要做相应的调整。


1.x Coprocessor存在的问题
由于CoprocessorEnvironment和他所对应的Observer类型并不是静态绑定的,所以CoprocessorHost不知道自己对应的Observer类型是哪个。这就导致了如下问题:
问题1:所有的host加载所有的observer,比如,MasterCoprocessorHost也会加载RegionObserver(其实只需要加载MasterObserver)。

问题2:host需要在运行时通过进行‘observer instanceOf ExpectedObserver’这样的检查来过滤掉不兼容的observer。
问题3:coprocessor host实现中存在大量重复的方法。

Observer和Coprocessor之间的继承关系导致如下问题:
问题4:如果第三方的coprocessor要使用多个observer,就需要在一个类里面派生所有用到的observer,导致这个类里面方法太多,类变得庞大,例如AccessController类有100多个方法:


7174d229bed0b360238e0d49e256e8a28fafd835


解决办法
主要的改动有两个:

  1. 给CoprocessorEnvironment接口增加类型参数,变成CoprocessorEnvironment,这样每个CoprocessorHost里面只需要加载特定的Coprocessor即可。

  2. 引入4个coprocessor,并把coprocessor和Observer之间的关系由继承改为组合。

这样针对上面的问题1,CoprocessorHost可以通过CoprocessorEnvironment的类型参数和coprocessor的类型静态绑定,在加载时就可以忽略不匹配的类型。
针对问题2和问题3,新的实现里面把重复的方法都放在了CoprocessorHost里面做了实现。
针对问题4,把继承改为组合,同时在coprocessor里面提供了get方法来获得对应的Observer。

这里面,问题1,2,3其实都只涉及HBase内部运行机制,所对应的改动其实对coprocessor的开发也基本没有影响。真正对我们有影响的主要还是把继承改为组合。这样,之前的代码只需要继承Observer,现在则需要实现Observer和coprocessor两个接口。同时还需要实现coprocessor接口的getxxxObserver。


HBASE-17312 【JDK8】 Use default method for Observer Coprocessors

https://issues.apache.org/jira/browse/HBASE-17312

利用JDK8的新特性,给interface提供了默认实现,而不是像1.x里面放在Basexxx里面,这样对我们的影响是原来代码里面的
"Foo extends BaseXXXObserver"要改成"Foo implements XXXObserver"。


HBASE-18502 Change MasterObserver to use TableDescriptor and ColumnFamilyDescriptor

https://issues.apache.org/jira/browse/HBASE-18502

需要注意的是2.0里面TableDescriptor和HTableDescriptor的接口有一些地方不一样,需要针对性的做一些处理。


HBASE-18528 DON'T allow user to modify the passed table/column descriptor

https://issues.apache.org/jira/browse/HBASE-18528

如果之前有在coprocessor里面修改表或列族的一些属性的话,现在就需要重新设计了。


d3f2f0da5b6761a64c7049db7719525a2c492a0c


大家工作学习遇到HBase技术问题,把问题发布到HBase技术社区论坛http://hbase.group,欢迎大家论坛上面提问留言讨论。想了解更多HBase技术关注HBase技术社区公众号(微信号:hbasegroup),非常欢迎大家积极投稿。


096973d69f34b1380151180fd0a8ff2cade5bced


HBase技术交流社区 - 阿里官方“HBase生态+Spark社区大群”点击加入:https://dwz.cn/Fvqv066s

相关文章
|
分布式数据库 Hbase 设计模式
|
Java Shell 分布式数据库
【大数据技术Hadoop+Spark】HBase数据模型、Shell操作、Java API示例程序讲解(附源码 超详细)
【大数据技术Hadoop+Spark】HBase数据模型、Shell操作、Java API示例程序讲解(附源码 超详细)
306 0
|
11天前
|
分布式计算 Java Hadoop
java使用hbase、hadoop报错举例
java使用hbase、hadoop报错举例
51 6
|
5月前
|
分布式计算 Ubuntu Hadoop
Ubuntu22.04下搭建Hadoop3.3.6+Hbase2.5.6+Phoenix5.1.3开发环境的指南
呈上,这些步骤如诗如画,但有效且动人。仿佛一个画家在画布上描绘出一幅完美的画面,这就是你的开发环境。接下来,尽情去创造吧,祝编程愉快!
265 19
|
分布式计算 Java Hadoop
java使用hbase、hadoop报错举例
java使用hbase、hadoop报错举例
261 4
|
12月前
|
分布式计算 Hadoop Shell
Hadoop-35 HBase 集群配置和启动 3节点云服务器 集群效果测试 Shell测试
Hadoop-35 HBase 集群配置和启动 3节点云服务器 集群效果测试 Shell测试
253 4
|
12月前
|
SQL 分布式计算 Hadoop
Hadoop-37 HBase集群 JavaAPI 操作3台云服务器 POM 实现增删改查调用操作 列族信息 扫描全表
Hadoop-37 HBase集群 JavaAPI 操作3台云服务器 POM 实现增删改查调用操作 列族信息 扫描全表
123 3
|
12月前
|
分布式计算 Hadoop Shell
Hadoop-36 HBase 3节点云服务器集群 HBase Shell 增删改查 全程多图详细 列族 row key value filter
Hadoop-36 HBase 3节点云服务器集群 HBase Shell 增删改查 全程多图详细 列族 row key value filter
154 3
|
12月前
|
SQL 分布式计算 Hadoop
Hadoop-34 HBase 安装部署 单节点配置 hbase-env hbase-site 超详细图文 附带配置文件
Hadoop-34 HBase 安装部署 单节点配置 hbase-env hbase-site 超详细图文 附带配置文件
392 2
|
12月前
|
存储 分布式计算 Hadoop
Hadoop-33 HBase 初识简介 项目简介 整体架构 HMaster HRegionServer Region
Hadoop-33 HBase 初识简介 项目简介 整体架构 HMaster HRegionServer Region
153 2