HBase协处理器observer

一、简介

本文将介绍HBase协处理器中的observer,observer协处理器类似于数据库中的触发器,也类似于程序设计中的AOP。其作用实在数据操作函数中预留钩子函数,使你可以编写pre-hooks或者post-hooks进行拦截操作。

二、请求生命周期

(1)HBase启动的时候会根据元信息加载observer对象,并将他部署在对应的region上的CoprocessorHost(注意部署的对象会被复用,而不是一个请求生成一次对象处理)
(2)observer对象初始化的时候,会调用start(CoprocessorEnvironment e)函数,我们可以在该函数中做资源的初始化。
(3)客户端发送请求后,请求会定位到对应的region,CoprocessorHost会拦截符合条件的请求,进行pre-hook或者post-hook操作(hook函数的执行都是同步操作)
(4)完成数据操作和对应hook操作后,返回响应给客户端。

三、例子:使用observer实现辅助索引

在Hbase中只有单行的事务,同时索引也只有rowkey,如果我们需要建立辅助索引,我们只能使用两个单独的表去维护。例如在一次操作中同时添加两条数据。

public void fun(){
  put(a);               // (1)
  put(b);              //  (2)
}

因为HBase只有单行事务,所以(1)成功并不能保证(2)能同时成功,假如不能同时成功HBase并不能提供跨行事务回滚的操作。

一个经典的例子是在《HBase实战》中关注与被关注者的实现。情景如下:
当a关注b时,在follower表添加一行数据,rowkey为 hash(a)+hash(b)
同时在followedBy表添加一行数据,rowkey为hash(b)+hash(a)
这样就能实现我关注了谁 和 谁关注了我这样的需求。

明显hbase不提供跨行事务去保证这两张表数据的一致性,但是observer的 hook函数提供了一致性的保证。当postPut函数失败的时候,HBase会自动重试postPut函数,直到postPut函数执行成功,通过同步重试来保证多条数据是同时插入成功的。

以下是代码例子,注HBase的版本是1.15,你需要在Maven中引入hbase-client和hbase-server这两个依赖,同时Java的编译版本需要是1.7

public class FollowerObserver extends BaseRegionObserver {

    Logger logger = LoggerFactory.getLogger(FollowerObserver.class);

    private FollowedByDAO followedByDAO;
    private Connection connection;

    @Override
    public void postPut(ObserverContext<RegionCoprocessorEnvironment> e, Put put, WALEdit edit, Durability durability) throws IOException {
        logger.info("observer start");
        try{
            String tableNames = e.getEnvironment().getRegionInfo().getTable().getNameAsString();
            if (!tableNames.equals("follower")){
                return;
            }
            Cell fromCell = put.get(Bytes.toBytes("f"),Bytes.toBytes("from")).get(0);
            byte[] fromb = CellUtil.cloneValue(fromCell);
            String from = Bytes.toString(fromb);
            Cell toCell = put.get(Bytes.toBytes("f"),Bytes.toBytes("to")).get(0);
            byte[] tob = CellUtil.cloneValue(toCell);
            String to = Bytes.toString(tob);
            logger.info("{} follow {}",from,to);
            followedByDAO.addFollower(from,to);
            logger.info("create followedby relation successfully!");
        }catch (Throwable t){
            logger.error(t.getMessage(),t);
            throw new IOException(t.getMessage());
        }finally {
            logger.info("observer end!");
        }

    }


    @Override
    public void start(CoprocessorEnvironment e) throws IOException {
        logger.info("---------------init---------------");
        Configuration conf = e.getConfiguration();
        connection = ConnectionFactory.createConnection(conf);
        followedByDAO = new FollowedByDAO(connection);
    }


    @Override
    public void stop(CoprocessorEnvironment e) throws IOException {
        logger.info("------------destroy------------------");
        connection.close();
        followedByDAO.close();
    }
}

四、安装observer

(1)将目标项目下执行 mvn clean package
(2)将Jar包上传到服务器或者HDFS
(3)启动hbase shell,执行以下命令

#禁用目标表
disable 'follower'
#将之前载入的协处理器卸载(如果有)
alter 'follower',METHOD => 'table_att_unset',NAME => 'coprocessor$1'
#加载新的协处理器,指定Jar文件的路径 | 目标类的路径 | 优先级
alter 'follower',METHOD => 'table_att' , 'coprocessor'=>'file:///path/to/your/jar|com.sample.hbase.co.FollowerObserver|1001'
#启动目标表
enable 'follower'

五、注意事项

(1) observer的hook函数是同步的,这意味着如果你在hook函数中遭遇死锁(HBase会上行锁,因此要检查你的代码在并发环境下是否可能会发生死锁),或者失败的时候,它会一直阻塞直到hook函数执行成功。这意味着使用hook函数越多,在hook函数中做的数据操作越多,越影响写入的吞吐率。
(2) observer的安装,更新,卸载都需要将对应的表disable后才能进行,这意味着他并不适合编写易变的业务逻辑,例如本文例子中的关注者关系的索引的维护,这种业务逻辑应该尽量避免实现在这一层。(至于如何保证一致性可以在另一文章中阐述)
(3) observer很难调试,只能打log,log输出在执行该对象的服务器上,可以在hbase/log中查看。引入Log的方法是LoggerFactory.getLogger(ClassName)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容

  • 一.简述如何安装配置apache 的一个开源的hadoop 1.使用root账户登陆 2.修改ip 3.修改hos...
    栀子花_ef39阅读 4,939评论 0 52
  • 一、简介 Hbase:全名Hadoop DataBase,是一种开源的,可伸缩的,严格一致性(并非最终一致性)的分...
    菜鸟小玄阅读 2,369评论 0 12
  • HBase存储架构图 HBase Master 为Region server分配region 负责Region s...
    kimibob阅读 5,572评论 0 52
  • 【什么是大数据、大数据技术】 大数据,又称巨量资料,指的是所涉及的数据资料量规模巨大到无法在合理时间内通过传统的应...
    kimibob阅读 2,736评论 0 51
  • 参考:https://www.jianshu.com/p/569106a3008f 最近在逐步跟进Hbase的相关...
    博弈史密斯阅读 849评论 1 1