协处理器概念

一、协处理器有两种: 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相关推荐

  1. 使用HBase Coprocessor协处理器

    原文: http://www.zhyea.com/2017/04/13/using-hbase-coprocessor.html HBase的Coprocessor是模仿谷歌BigTable的Copr ...

  2. Hbase Coprocessor(协处理器)的使用

    本博客记录初次使用hbase coprocessor的过程.协处理器分两种类型,系统协处理器可以全局导入region server上的所有数据表,表协处理器即是用户可以指定一张表使用协处理器.协处理器 ...

  3. 2021年大数据HBase(十六):HBase的协处理器(Coprocessor)

    全网最详细的大数据HBase文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 HBase的协处理器(Coprocessor) 一.起源 二 ...

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

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

  5. 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实 ...

  6. 2021年大数据HBase(五):HBase的相关操作JavaAPI方式

    全网最详细的大数据HBase文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 前言 HBase的相关操作-JavaAPI方式 一.需求说明 ...

  7. HBase建表高级属性,hbase应用案例看行键设计,HBase和mapreduce结合,从Hbase中读取数据、分析,写入hdfs,从hdfs中读取数据写入Hbase,协处理器和二级索引

    1. Hbase高级应用 1.1建表高级属性 下面几个shell 命令在hbase操作中可以起到很到的作用,且主要体现在建表的过程中,看下面几个create 属性 1. BLOOMFILTER 默认是 ...

  8. 技术篇-HBase Coprocessor 的实现与应用

    本次分享的内容主要分为以下五点: Coprocessor 简介 Endpoint 服务端实现 Endpoint 客户端实现 Observer 实现二级索引 Coprocessor 应用场景 1. Co ...

  9. 五十四、HBase的协处理器

    在旧版本的(<0.92)HBase中无法轻易建立"二级索引",难以执行求和.计数.排序等操作.例如统计数据表的总行数,需要使用Counter方法,执行一次MapReduce ...

最新文章

  1. 《算法竞赛进阶指南》打卡-基本算法-AcWing 95. 费解的开关:位运算、枚举、递推
  2. 华为触摸提示音怎么换_抖音苹果iPhone手机怎么改微信消息提示音 自定义换声音教程...
  3. python做词云做文本处理_Python生成词云的制作
  4. Springboot实现邮件发送(2020最新版)
  5. 使用Arduino和超声波传感器实现简单测距
  6. Java解决Hash(散列)冲突的四种方法--开放地址法(线性探测,二次探测,伪随机探测)、链地址法、再哈希、建立公共溢出区
  7. 【推荐实践】Bandit算法在携程推荐系统中的应用与实践
  8. 设计模式【单例模式】
  9. 一步一步解决“不能上网”
  10. 疫期免费 “零接触”云迁移~工具替代人力! 人不聚,活儿继续!
  11. python数据分析的例子_Python数据分析案例—商圈客流量特征分析
  12. 访问网上邻居-修改账号密码
  13. bitcoin全节点搭建
  14. 设置手机最小宽度为1000,无限重启怎么办
  15. ios关联启动_部落冲突电脑版与IOS设备关联教程
  16. 【CSS】4步教你绘制爱心图案
  17. 小秘谈币:谈谈炒币的几点感悟
  18. 通过支付宝二维码链接直接调起支付宝支付
  19. 文案生成 python_用 Python 开发一个【视频营销号】生成器
  20. 让你在[三分钟自我介绍]中突出自我

热门文章

  1. SSL证书部署案例:浙江教育技术中心教育信息化系统HTTPS加密
  2. 挑战易语言制作28第N天
  3. html页面时钟插件,Clock.js-HTML5模拟时钟jQuery插件
  4. VR全景拍摄技巧有哪些?VR全景怎么拍摄?
  5. python创建长度为n的数组_使用numpy库创建N纬数组(ndarray)的四种创建方法
  6. 51单片机最小系统的制作
  7. 华为自动驾驶视频曝光 | 解读华为“ADS高阶自动驾驶全栈解决方案”
  8. Web Scraper 翻页——抓取分页器翻页的网页(Web Scraper 高级用法)| 简易数据分析 12
  9. 【新的开始,新的征程】
  10. itemdatabound小结