Hbase Coprocessor 协处理器 与 JavaAPI
协处理器概念
一、协处理器有两种: observer 和 endpoint
1、observer协处理器
Observer 类似于传统数据库中的触发器,当发生某些事件的时候这类协处理器会被 Server 端调用。Observer Coprocessor 就是一些散布在 HBase Server 端代码中的 hook 钩子, 在固定的事件发生时被调用。比如: put 操作之前有钩子函数 prePut,该函数在 put 操作执行前会被 Region Server 调用;在 put 操作之后则有 postPut 钩子函数
以 Hbase2.0.0 版本为例,它提供了三种观察者接口:
RegionObserver:提供客户端的数据操纵事件钩子: Get、 Put、 Delete、 Scan 等
WALObserver:提供 WAL 相关操作钩子。
MasterObserver:提供 DDL-类型的操作钩子。如创建、删除、修改数据表等。
到 0.96 版本又新增一个 RegionServerObserver下图是以 RegionObserver 为例子讲解 Observer 这种协处理器的原理:
客户端发起get请求
该请求被分派给合适的RegionServer和Region
coprocessorHost拦截该请求,然后在该表上登记的每个RegionObserer上调用preGet()
如果没有被preGet拦截,该请求继续送到Region,然后进行处理
Region产生的结果再次被coprocessorHost拦截,调用posGet()处理
加入没有postGet()拦截该响应,最终结果被返回给客户端
2、endpoint 协处理器
Endpoint 协处理器类似传统数据库中的存储过程,客户端可以调用这些 Endpoint 协处理器执行一段 Server 端代码,并将 Server 端代码的结果返回给客户端进一步处理,最常见的用法就是进行聚集操作
如果没有协处理器,当用户需要找出一张表中的最大数据,即max 聚合操作,就必须进行全表扫描,在客户端代码内遍历扫描结果,并执行求最大值的操作。这样的方法无法利用底层集群的并发能力,而将所有计算都集中到 Client 端统一执 行,势必效率低下。
利用 Coprocessor,用户可以将求最大值的代码部署到 HBase Server 端,HBase 将利用底层 cluster 的多个节点并发执行求最大值的操作。即在每个 Region 范围内 执行求最大值的代码,将每个 Region 的最大值在 Region Server 端计算出,仅仅将该 max 值返回给客户端。在客户端进一步将多个 Region 的最大值进一步处理而找到其中的最大值。这样整体的执行效率就会提高很多
协处理器 Java API
一、pom 配置
<!-- https://mvnrepository.com/artifact/org.apache.hbase/hbase-client --><dependency><groupId>org.apache.hbase</groupId><artifactId>hbase-client</artifactId><version>2.2.4</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.hbase/hbase-server --><dependency><groupId>org.apache.hbase</groupId><artifactId>hbase-server</artifactId><version>2.2.4</version></dependency>
二、在自定义包里创建类
在此文件包名为 com.niitchina.hbasedemo.coprocessor,类名为MyRegionObserver,此路径与名字与后面配置有密切联系,若想偷懒可以完全跟随。
三、写入代码
package com.niitchina.hbasedemo.coprocessor;import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.Coprocessor;
import org.apache.hadoop.hbase.CoprocessorEnvironment;
import org.apache.hadoop.hbase.client.Delete;
import org.apache.hadoop.hbase.client.Durability;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.coprocessor.*;
import org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker;
import org.apache.hadoop.hbase.regionserver.InternalScanner;
import org.apache.hadoop.hbase.regionserver.Store;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.hbase.wal.WALEdit;import java.io.FileWriter;
import java.io.IOException;
import java.util.List;
import java.util.Optional;public class MyRegionObserver implements RegionObserver,RegionCoprocessor {@Overridepublic Optional<RegionObserver> getRegionObserver() {return Optional.of(this);}private static void outInfo(String str){try {FileWriter fw = new FileWriter("/training/hbase-2.2.4/coprocessor.txt",true);fw.write(str + "\r\n");fw.close();} catch (Exception e) {e.printStackTrace();}}@Overridepublic void start(CoprocessorEnvironment env) throws IOException {RegionCoprocessor.super.start(env);outInfo("MyRegionObserver.start()");}@Overridepublic void stop(CoprocessorEnvironment env) throws IOException {}@Overridepublic void preGetOp(ObserverContext<RegionCoprocessorEnvironment> e, Get get, List<Cell> results) throws IOException {RegionObserver.super.preGetOp(e, get, results);String rowkey = Bytes.toString(get.getRow());// custom code here , this code will run before the get operationoutInfo("MyRegionObserver.preGetOp() : Before get operation rowkey = " + rowkey);}public void postGetOp(ObserverContext<RegionCoprocessorEnvironment> e, Get get, List<Cell> results) throws IOException {RegionObserver.super.postGetOp(e, get, results);String rowkey = Bytes.toString(get.getRow());//custom codeoutInfo("MyRegionObserver.postGetOp() : After Get Operation rowkey = " + rowkey);}@Overridepublic void prePut(ObserverContext<RegionCoprocessorEnvironment> c, Put put, WALEdit edit, Durability durability) throws IOException {RegionObserver.super.prePut(c, put, edit, durability);String rowkey = Bytes.toString(put.getRow());// logicoutInfo("MyRegionObserver.prePut() : rowkey = " + rowkey);}@Overridepublic void postPut(ObserverContext<RegionCoprocessorEnvironment> c, Put put, WALEdit edit, Durability durability) throws IOException {RegionObserver.super.postPut(c, put, edit, durability);String rowkey = Bytes.toString(put.getRow());// custom codeoutInfo("MyRegionObserver.postPut() : rowkey = " + rowkey);}@Overridepublic void preDelete(ObserverContext<RegionCoprocessorEnvironment> e, Delete delete, WALEdit edit, Durability durability) throws IOException {RegionObserver.super.preDelete(e, delete, edit, durability);String rowkey = Bytes.toString(delete.getRow());outInfo("MyRegionObserver.preDelete() : rowkey = " + rowkey);}@Overridepublic void postDelete(ObserverContext<RegionCoprocessorEnvironment> e, Delete delete, WALEdit edit, Durability durability) throws IOException {RegionObserver.super.postDelete(e, delete, edit, durability);String rowkey = Bytes.toString(delete.getRow());// custom codeoutInfo("MyRegionObserver.postDelete() : rowkey = " + rowkey);}
}
四、项目打jar包
五、Hbase 文件配置
1、进入Hbase安装路径下conf文件夹对hbase-site.xml进行配置,com.niitchina.hbasedemo.coprocessor为包名,MyRegionObserver为类名,若上述步骤名称不同则这里需要更换具体内容。
<property>
<name>hbase.coprocessor.region.classes</name>
<value>com.niitchina.hbasedemo.coprocessor.MyRegionObserver</value>
</property>
2.、重启Hbase
六、运行插入、删除、查询get可以与协处理器连接
日志文件将会保存在自定义路径下,我们代码里设置的 /training/hbase-2.2.4,可以看到日志文件出来了
vi coprocessor.txt 可以看看里面日志,运行成功。
Hbase Coprocessor 协处理器 与 JavaAPI相关推荐
- 使用HBase Coprocessor协处理器
原文: http://www.zhyea.com/2017/04/13/using-hbase-coprocessor.html HBase的Coprocessor是模仿谷歌BigTable的Copr ...
- Hbase Coprocessor(协处理器)的使用
本博客记录初次使用hbase coprocessor的过程.协处理器分两种类型,系统协处理器可以全局导入region server上的所有数据表,表协处理器即是用户可以指定一张表使用协处理器.协处理器 ...
- 2021年大数据HBase(十六):HBase的协处理器(Coprocessor)
全网最详细的大数据HBase文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 HBase的协处理器(Coprocessor) 一.起源 二 ...
- HBase的协处理器(Coprocessor)、HBase如何使用二级索引、observer协处理器、 endpoint协处理器、Hbase 协处理器加载方式
HBase的协处理器(Coprocessor).HBase不可以使用二级索引吗? 起源 Hbase 作为列族数据库最经常被人诟病的特性包括: 无法轻易建立"二级索引" 难以执 行求 ...
- Sqoop导入HBase,并借助Coprocessor协处理器同步索引到ES
1.环境 Mysql 5.6 Sqoop 1.4.6 Hadoop 2.5.2 HBase 0.98 Elasticsearch 2.3.5 2.安装(略过) 3.HBase Coprocessor实 ...
- 2021年大数据HBase(五):HBase的相关操作JavaAPI方式
全网最详细的大数据HBase文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 前言 HBase的相关操作-JavaAPI方式 一.需求说明 ...
- HBase建表高级属性,hbase应用案例看行键设计,HBase和mapreduce结合,从Hbase中读取数据、分析,写入hdfs,从hdfs中读取数据写入Hbase,协处理器和二级索引
1. Hbase高级应用 1.1建表高级属性 下面几个shell 命令在hbase操作中可以起到很到的作用,且主要体现在建表的过程中,看下面几个create 属性 1. BLOOMFILTER 默认是 ...
- 技术篇-HBase Coprocessor 的实现与应用
本次分享的内容主要分为以下五点: Coprocessor 简介 Endpoint 服务端实现 Endpoint 客户端实现 Observer 实现二级索引 Coprocessor 应用场景 1. Co ...
- 五十四、HBase的协处理器
在旧版本的(<0.92)HBase中无法轻易建立"二级索引",难以执行求和.计数.排序等操作.例如统计数据表的总行数,需要使用Counter方法,执行一次MapReduce ...
最新文章
- 《算法竞赛进阶指南》打卡-基本算法-AcWing 95. 费解的开关:位运算、枚举、递推
- 华为触摸提示音怎么换_抖音苹果iPhone手机怎么改微信消息提示音 自定义换声音教程...
- python做词云做文本处理_Python生成词云的制作
- Springboot实现邮件发送(2020最新版)
- 使用Arduino和超声波传感器实现简单测距
- Java解决Hash(散列)冲突的四种方法--开放地址法(线性探测,二次探测,伪随机探测)、链地址法、再哈希、建立公共溢出区
- 【推荐实践】Bandit算法在携程推荐系统中的应用与实践
- 设计模式【单例模式】
- 一步一步解决“不能上网”
- 疫期免费 “零接触”云迁移~工具替代人力! 人不聚,活儿继续!
- python数据分析的例子_Python数据分析案例—商圈客流量特征分析
- 访问网上邻居-修改账号密码
- bitcoin全节点搭建
- 设置手机最小宽度为1000,无限重启怎么办
- ios关联启动_部落冲突电脑版与IOS设备关联教程
- 【CSS】4步教你绘制爱心图案
- 小秘谈币:谈谈炒币的几点感悟
- 通过支付宝二维码链接直接调起支付宝支付
- 文案生成 python_用 Python 开发一个【视频营销号】生成器
- 让你在[三分钟自我介绍]中突出自我
热门文章
- SSL证书部署案例:浙江教育技术中心教育信息化系统HTTPS加密
- 挑战易语言制作28第N天
- html页面时钟插件,Clock.js-HTML5模拟时钟jQuery插件
- VR全景拍摄技巧有哪些?VR全景怎么拍摄?
- python创建长度为n的数组_使用numpy库创建N纬数组(ndarray)的四种创建方法
- 51单片机最小系统的制作
- 华为自动驾驶视频曝光 | 解读华为“ADS高阶自动驾驶全栈解决方案”
- Web Scraper 翻页——抓取分页器翻页的网页(Web Scraper 高级用法)| 简易数据分析 12
- 【新的开始,新的征程】
- itemdatabound小结