参考链接1:https://www.cnblogs.com/ios123/p/6370724.html

参考链接2:http://www.zhyea.com/2017/04/13/using-hbase-coprocessor.html

RegionObserver

注:每次更新协处理器方法,最好加上版本更新,否则可能会出现更新失败

  • 协处理器安装-表级别安装
disable 'wechat_article'
alter 'wechat_article' , METHOD =>'table_att','coprocessor'=>'hdfs://test111:8020/coprocessor/hbase-coprocessor-0.0.6-SNAPSHOT.jar|com.izhonghong.hbase.coprocessor.WechatUserObserver|1001'
enable 'wechat_article'
  • 卸载协处理器:
disable 'wechat_article'
alter 'wechat_article', METHOD => 'table_att_unset', NAME => 'coprocessor$1'
enable
  • 查看是否成功
hbase(main):002:0> desc 'wechat_article'
Table wechat_article is ENABLED
wechat_article, {TABLE_ATTRIBUTES => {coprocessor$1 => 'hdfs://test111:8020/coprocessor/hbase-coprocessor-0.0.14-SNAPSHOT.jar|com.izhonghong.hbase.coproces
sor.WechatUserObserver|1001'}
COLUMN FAMILIES DESCRIPTION
{NAME => 'fn', BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', KEEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER',COMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '65536', REPLICATION_SCOPE => '0'}
1 row(s) in 0.3030 seconds

代码开发

代码查看(RegionObserverDemo.java):http://note.youdao.com/noteshare?id=9e8b53139c00840d00308356dda0f203&sub=B241C0BD8E46423EBB48DDC285EC5BC2

  • prePut-插入前处理数据
插入数据前判断download_type类型是否在200-300范围中,如果在直接将用户id插入到另外一个表中,并做关联
@Overridepublic void prePut(final ObserverContext<RegionCoprocessorEnvironment> e,final Put put, final WALEdit edit, final Durability durability)throws IOException {LOG.warn("###########################################");// 获取列簇为FAMAILLY_NAME,列名为DOWNLOAD_TYPE的数据List<Cell> cells = put.get(Bytes.toBytes(FAMAILLY_NAME),Bytes.toBytes(DOWNLOAD_TYPE));//判断列名为DOWNLOAD_TYPE是否包含数据,不包含直接return,退出处理if (cells == null || cells.size() == 0) {LOG.warn("download_type 字段不存在退出过滤");return;}// 列名为DOWNLOAD_TYPE已包含数据,进行处理byte[] aValue = null;for (Cell cell : cells) {try {//DOWNLOAD_TYPE转换为数字aValue = CellUtil.cloneValue(cell);Integer valueOf = Integer.valueOf(Bytes.toString(aValue));if(valueOf>=200 &&valueOf<=300) {//如果DOWNLOAD_TYPE范围在200-300之间,获取用户UID信息List<Cell> list = put.get(Bytes.toBytes(FAMAILLY_NAME),Bytes.toBytes(UID));//判断用户是否包含UIDif (list == null || list.size() == 0) {LOG.warn("用户BIZ不存在,或者为空");return;}//获取用户UIDCell cell2 = list.get(0);LOG.warn("UID--->"+Bytes.toString(CellUtil.cloneValue(cell2)));//将用户UID设置为rowkey,原数据的rowkey当作列名,download_type当作列值Put put2 = new Put(CellUtil.cloneValue(cell2));put2.addColumn(Bytes.toBytes(FAMAILLY_NAME), put.getRow(), aValue);//插入数据到table中table.put(put2);table.close();}else {LOG.warn("Download type is not in range.");}} catch (Exception e1) {LOG.error("异常------->>>>>> "+e1.getMessage());return ;}}}
  • preGetOp-处理返回结果只对get有效
@Overridepublic void preGetOp(final ObserverContext<RegionCoprocessorEnvironment> e,final Get get, final List<Cell> results) throws IOException { //判断查询的rowkey是否等于testif(Bytes.equals(get.getRow(),Bytes.toBytes("test"))) { //新增返回数据fn:time,值为当前时间戳给客户端KeyValue kv = new KeyValue(get.getRow(),Bytes.toBytes("fn"),Bytes.toBytes("time"),1535555555555l ,Bytes.toBytes(String.valueOf(System.currentTimeMillis())));results.add(kv);}}
  • preScannerOpen-在客户端打开新扫描仪之前过滤,此方法会覆盖原有filter
@Overridepublic RegionScanner preScannerOpen(final ObserverContext<RegionCoprocessorEnvironment> e, final Scan scan,final RegionScanner s) throws IOException {//查询rowkey等于test的行进行过滤(显示不等test的数据),会覆盖原有filterFilter filter = new RowFilter(CompareOp.NOT_EQUAL, new BinaryComparator(Bytes.toBytes("test")));scan.setFilter(filter);return s;}
  • postScannerNext,对返回结果进行过滤
@Overridepublic boolean postScannerNext(final ObserverContext<RegionCoprocessorEnvironment> e, final InternalScanner s,final List<Result> results, final int limit, final boolean hasMore) throws IOException {Result result = null;//获取返回结果,如果rowkey等于test则过滤掉Iterator<Result> iterator = results.iterator();while (iterator.hasNext()) {result = iterator.next();if (Bytes.equals(result.getRow(), Bytes.toBytes("test2"))) {iterator.remove();break;}}return hasMore;}
  • preDelete,,删除列前进行判断该列是否可以删除
@Overridepublic void preDelete(final ObserverContext<RegionCoprocessorEnvironment> e,final Delete delete, final WALEdit edit, final Durability durability)throws IOException {// 判断是否对列簇FAMAILLY_NAME操作List<Cell> cells = delete.getFamilyCellMap().get(Bytes.toBytes(FAMAILLY_NAME));if (cells == null || cells.size() == 0) {//如果没有对指定列簇操作则跳过判断,直接执行语句return;}byte[] qualifierName = null;boolean aDeleteFlg = false;for (Cell cell : cells) {//获取带操作的列名qualifierName = CellUtil.cloneQualifier(cell);// 如果列名等于DOWNLOAD_TYPE ,则抛出异常。注://需查看该值在集群中配置多少,否则重试好几百次性能会很差。//conf.set("hbase.client.retries.number", "1");//client失败重试次数if (Arrays.equals(qualifierName, Bytes.toBytes(DOWNLOAD_TYPE))) {throw new IOException("You cannot delete read-only columns.");}// 检查是否存在对UID列进行删除if (Arrays.equals(qualifierName, Bytes.toBytes(UID))) {aDeleteFlg = true;}}// 如果对于UID列有删除,则需要对DOWNLOAD_TYPE列也要删除if (aDeleteFlg){delete.addColumn(Bytes.toBytes(FAMAILLY_NAME), Bytes.toBytes(DOWNLOAD_TYPE));}}

Hbase 协处理器 RegionObserver相关推荐

  1. 细述hbase协处理器

    1.起因(Why HBase Coprocessor) HBase作为列族数据库最经常被人诟病的特性包括:无法轻易建立"二级索引",难以执行求和.计数.排序等操作.比如,在旧版本的 ...

  2. Hbase 协处理器之将数据保存到es (二级索引)

    利用Hbase Coprocessor 实现将插入hbase中的数据保存至ElasticSearch中,实现二级索引目的 版本: Hbase: 2.1 ES:6.3.0 一.Coprocessor代码 ...

  3. HBase-11-HBase Coprocessor HBase协处理器

    HBase协处理器受BigTable协处理器的启发,为用户提供类库和运行时环境,使得代码能够在HBaseRegionServer和Master上处理 ◆系统协处理器and表协处理器 ◆Observer ...

  4. Hbase协处理器实践总结(hbase数据同步)

    Hbase协处理器实践总结(hbase数据同步) 前景提示: 使用背景 使用hbase同步数据到es,每次hbase客户端发送put请求后,触发协处理器将数据同步到es. 版本介绍 hbase版本:1 ...

  5. hbase 协处理器 部署_HBase协处理器加载的三种方式

    本文主要给大家罗列了hbase协处理器加载的三种方式:shell加载(动态).api加载(动态).配置文件加载(静态).其中静态加载方式需要重启hbase. 我们假设我们已经有一个现成的需要加载的协处 ...

  6. Hbase协处理器简介

    Hbase协处理器简介 使用协处理器的风险:直接在RegionServer上运行,直接接触数据,轻则影响集群的性能和稳定性,重则破坏数据: 系统协处理器针对整个集群,表协处理器只针对某张表:

  7. hbase 协处理器 部署_hbase协处理器概念及知识点总结

    HBase是一种Hadoop数据库,经常被描述为一种稀疏的,分布式的,持久化的,多维有序映射,它基于行键.列键和时间戳建立索引,是一个可以随机访问的存储和检索数据的平台.HBase不限制存储的数据的种 ...

  8. HBase的协处理器(Coprocessor)、HBase如何使用二级索引、observer协处理器、 endpoint协处理器、Hbase 协处理器加载方式

    HBase的协处理器(Coprocessor).HBase不可以使用二级索引吗? 起源 Hbase 作为列族数据库最经常被人诟病的特性包括: 无法轻易建立"二级索引" 难以执 行求 ...

  9. hbase协处理器Coprocessor(简介)

    一:介绍 把一部分计算也移动到数据的存放端:允许用户执行region级的操作:可以动态加载. 二:使用场景: 1.使用钩子来关联行修改操作来维护辅助索引,或维护一些数据间的引用完整性. 2.权限控制 ...

最新文章

  1. 关于iOS 11的适配
  2. converter 迁移xen server 上的虚拟机 到 wmware esxi
  3. 008_tracker.conf配置详情
  4. Docker中应用的性能调优指南(一)- 先谈谈容器化性能调优
  5. 还有Html.EditorFor和Html.Html.TextBox到底差什么呢
  6. jdbc map获取keys_跟我学shardingjdbc之分布式主键及其自定义
  7. linux内核netfilter模块分析之:HOOKs点的注册及调用
  8. linux ctrl c 子进程,ctrl c会向Linux中的父进程和子进程发送SIGINT信号吗?
  9. Fixjs实践——标签、按钮控件
  10. Date对象中的方法
  11. Js/jQuery实时监听input输入框值变化
  12. Eclipse设置智能提示
  13. react-pdf预览pdf
  14. ACCESS数据库基本使用
  15. 【车间调度】柔性作业车间调度问题的研究方法
  16. mysql outer join报错_千与千寻-MySQL联结join
  17. expected an indented block报错的原因
  18. C++GUI之wxWidgets(12)-编写应用涉及的类和方法(7)-事件处理(6)
  19. 学习记录【1】--chrome的控制台打开很慢
  20. msvcr100.dll丢失的解决方法

热门文章

  1. 金坛区实验幼儿园服务器不稳定,2019年金坛城区部分公办幼儿园服务区划分方案(试行)...
  2. python读取大文件内容_python读取大文件
  3. java英文版怎么汉化_请问,java中,将下面的英文名字变为中文 该怎样输出?
  4. 子窗体 记录选择_如何设计一个简单的Access登录窗体(1)
  5. 虚拟跳线软件干什么用的_视频教程:用 ESI 的虚拟跳线给你的声音添加效果
  6. Java构造方法以及重载
  7. html如何将设置文本效果,css如何对文本进行修饰
  8. qt的如何调整显示不为科学记数法_Excel操作技巧:如何将信息快速准确的录入Excel?...
  9. 朗读评价语言集锦_评语大全之朗诵评语艺术表现力
  10. centos禁用exec_CentOS停用按下Ctrl-Alt-Del 重启系统的功能