Hbase 协处理器 RegionObserver
参考链接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相关推荐
- 细述hbase协处理器
1.起因(Why HBase Coprocessor) HBase作为列族数据库最经常被人诟病的特性包括:无法轻易建立"二级索引",难以执行求和.计数.排序等操作.比如,在旧版本的 ...
- Hbase 协处理器之将数据保存到es (二级索引)
利用Hbase Coprocessor 实现将插入hbase中的数据保存至ElasticSearch中,实现二级索引目的 版本: Hbase: 2.1 ES:6.3.0 一.Coprocessor代码 ...
- HBase-11-HBase Coprocessor HBase协处理器
HBase协处理器受BigTable协处理器的启发,为用户提供类库和运行时环境,使得代码能够在HBaseRegionServer和Master上处理 ◆系统协处理器and表协处理器 ◆Observer ...
- Hbase协处理器实践总结(hbase数据同步)
Hbase协处理器实践总结(hbase数据同步) 前景提示: 使用背景 使用hbase同步数据到es,每次hbase客户端发送put请求后,触发协处理器将数据同步到es. 版本介绍 hbase版本:1 ...
- hbase 协处理器 部署_HBase协处理器加载的三种方式
本文主要给大家罗列了hbase协处理器加载的三种方式:shell加载(动态).api加载(动态).配置文件加载(静态).其中静态加载方式需要重启hbase. 我们假设我们已经有一个现成的需要加载的协处 ...
- Hbase协处理器简介
Hbase协处理器简介 使用协处理器的风险:直接在RegionServer上运行,直接接触数据,轻则影响集群的性能和稳定性,重则破坏数据: 系统协处理器针对整个集群,表协处理器只针对某张表:
- hbase 协处理器 部署_hbase协处理器概念及知识点总结
HBase是一种Hadoop数据库,经常被描述为一种稀疏的,分布式的,持久化的,多维有序映射,它基于行键.列键和时间戳建立索引,是一个可以随机访问的存储和检索数据的平台.HBase不限制存储的数据的种 ...
- HBase的协处理器(Coprocessor)、HBase如何使用二级索引、observer协处理器、 endpoint协处理器、Hbase 协处理器加载方式
HBase的协处理器(Coprocessor).HBase不可以使用二级索引吗? 起源 Hbase 作为列族数据库最经常被人诟病的特性包括: 无法轻易建立"二级索引" 难以执 行求 ...
- hbase协处理器Coprocessor(简介)
一:介绍 把一部分计算也移动到数据的存放端:允许用户执行region级的操作:可以动态加载. 二:使用场景: 1.使用钩子来关联行修改操作来维护辅助索引,或维护一些数据间的引用完整性. 2.权限控制 ...
最新文章
- 关于iOS 11的适配
- converter 迁移xen server 上的虚拟机 到 wmware esxi
- 008_tracker.conf配置详情
- Docker中应用的性能调优指南(一)- 先谈谈容器化性能调优
- 还有Html.EditorFor和Html.Html.TextBox到底差什么呢
- jdbc map获取keys_跟我学shardingjdbc之分布式主键及其自定义
- linux内核netfilter模块分析之:HOOKs点的注册及调用
- linux ctrl c 子进程,ctrl c会向Linux中的父进程和子进程发送SIGINT信号吗?
- Fixjs实践——标签、按钮控件
- Date对象中的方法
- Js/jQuery实时监听input输入框值变化
- Eclipse设置智能提示
- react-pdf预览pdf
- ACCESS数据库基本使用
- 【车间调度】柔性作业车间调度问题的研究方法
- mysql outer join报错_千与千寻-MySQL联结join
- expected an indented block报错的原因
- C++GUI之wxWidgets(12)-编写应用涉及的类和方法(7)-事件处理(6)
- 学习记录【1】--chrome的控制台打开很慢
- msvcr100.dll丢失的解决方法
热门文章
- 金坛区实验幼儿园服务器不稳定,2019年金坛城区部分公办幼儿园服务区划分方案(试行)...
- python读取大文件内容_python读取大文件
- java英文版怎么汉化_请问,java中,将下面的英文名字变为中文 该怎样输出?
- 子窗体 记录选择_如何设计一个简单的Access登录窗体(1)
- 虚拟跳线软件干什么用的_视频教程:用 ESI 的虚拟跳线给你的声音添加效果
- Java构造方法以及重载
- html如何将设置文本效果,css如何对文本进行修饰
- qt的如何调整显示不为科学记数法_Excel操作技巧:如何将信息快速准确的录入Excel?...
- 朗读评价语言集锦_评语大全之朗诵评语艺术表现力
- centos禁用exec_CentOS停用按下Ctrl-Alt-Del 重启系统的功能