Hbase Coprocessor 协处理器 与 JavaAPI

news2024/11/15 23:46:01

协处理器概念

一、协处理器有两种: 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 {
    @Override
    public 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();
        }
    }
    @Override
    public void start(CoprocessorEnvironment env) throws IOException {

        RegionCoprocessor.super.start(env);
        outInfo("MyRegionObserver.start()");
    }

    @Override
    public void stop(CoprocessorEnvironment env) throws IOException {

    }
    @Override
    public 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 operation
        outInfo("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 code
        outInfo("MyRegionObserver.postGetOp() : After Get Operation rowkey = " + rowkey);
    }
    @Override
    public 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());
        // logic
        outInfo("MyRegionObserver.prePut() : rowkey = " + rowkey);
    }

    @Override
    public 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 code
        outInfo("MyRegionObserver.postPut() : rowkey = " + rowkey);
    }

    @Override
    public 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);
    }

    @Override
    public 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 code
        outInfo("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 可以看看里面日志,运行成功。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/23142.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

go使用grpc

protoc下载 protoc是protobuf的编译工具&#xff0c;能根据.proto文件生成为各种语言的文件。 原始的protoc集成了如下语言的转换&#xff1a; cc#javaobjectcphppythonruby 但是没有集成go的转换工具。go的转换工具是在protoc的基础上使用插件的方式运行。 protoc 的下载地址…

java面试强基(7)

hashCode() 有什么用&#xff1f; ​ hashCode() 的作用是获取哈希码&#xff08;int 整数&#xff09;&#xff0c;也称为散列码。这个哈希码的作用是确定该对象在哈希表中的索引位置。 ​ hashCode()定义在 JDK 的 Object 类中&#xff0c;这就意味着 Java 中的任何类都包含…

阿里架构师耗时1年,把P8所需要的整个Java体系,都整理到了一起

始末 有人调侃我们说&#xff1a; 程序员不如送外卖。送外卖是搬运食物&#xff0c;自己是搬运代码&#xff0c;都不产出新的东西……透支体力&#xff0c;又消耗健康&#xff0c;可替代性极强&#xff0c;30岁之后就要面临被优化的危险……想跳槽&#xff0c;但是更高的平台…

科技风杂志科技风杂志社科技风编辑部2022年第31期目录

科技创新《科技风》投稿&#xff1a;cnqikantg126.com 基于钢架网箱清理控制系统的研究 张浩;崔新忠;丁树兵;尹杰;卢佳乐;王隽屹;张津宁; 1-3 遥感技术在海洋区域地质调查中的应用——以岛礁区调查为例 韩艳飞; 4-6 医院电气工程智能自动化及PLC技术在医院电气设备…

mipi介绍

文章目录1.MIPI简介1-1&#xff1a;DSI layer2.D_PHY2-1&#xff1a;D_PHY介绍2-2&#xff1a;电平状态2-3&#xff1a;lane结构2-4&#xff1a;data lane操作模式2-4-1&#xff1a;escape mode和space one hot coding2-4-2&#xff1a;Low-Power Data Transmission&#xff08…

图书借阅管理系统的设计与实现/书籍借还管理系统

摘要 随着Internet的发展&#xff0c;人们的日常生活已经离不开网络。未来人们的生活与工作将变得越来越数字化、网络化和电子化。网上借阅一系列功能将成为人们最关注话题&#xff0c;本论文是以构建图书借阅为目标&#xff0c;使用 Java制作&#xff0c;由前台用户借阅图书、…

计算机网络4小时速成:网络安全,被动攻击,主动攻击,对称加密,公钥秘钥,数字签名,鉴别,网络层安全协议IPsec,传输层安全协议SSL,防火墙,入侵检测系统

计算机网络4小时速成&#xff1a;网络安全&#xff0c;被动攻击&#xff0c;主动攻击&#xff0c;对称加密&#xff0c;公钥秘钥&#xff0c;数字签名&#xff0c;鉴别&#xff0c;网络层安全协议IPsec&#xff0c;传输层安全协议SSL&#xff0c;防火墙&#xff0c;入侵检测系统…

PTA题目 计算分段函数[1]

本题目要求计算下列分段函数f(x)的值&#xff1a; 输入格式: 输入在一行中给出实数x。 输出格式: 在一行中按“f(x) result”的格式输出&#xff0c;其中x与result都保留一位小数。 输入样例1: 10输出样例1: f(10.0) 0.1输入样例2: 0输出样例2: f(0.0) 0.0 #includ…

公众号免费题库接口

公众号免费题库接口 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&#xff08;点击…

IDEA Windows下SPARK连接Hive

IDEA Windows下SPARK连接Hive 文章目录IDEA Windows下SPARK连接Hive一、本地Windows环境配置二、IDEA项目配置1. POM配置2. 资源文件配置3. 测试验证一、本地Windows环境配置 本地构建HADOOP客户端 将大数据平台的HAODOP环境打包拿到本地环境来&#xff1a; #压缩整个HADOOP…

特征选择技术总结

在本文中&#xff0c;我们将回顾特性选择技术并回答为什么它很重要以及如何使用python实现它。 本文还可以帮助你解答以下的面试问题: 什么是特征选择?说出特性选择的一些好处你知道哪些特征选择技巧?区分单变量、双变量和多变量分析。我们能用PCA来进行特征选择吗?前向特征…

如何打造一支专业的QA团队,至少要关注这5点

目录 第一、专职的QA人员 第二、关注QA的能力素质 第三、适度的量化指标 第四、增加QA工作的透明度 第五、 充分利用好评审这把“利剑” QA是Quality Assurance的缩写&#xff0c;直接翻译过来就是“质量保证”的意思。 QA也称为质量工程师&#xff0c;基本上每个产品型或…

指纹浏览器——为跨境电商打造的跨境卫士

“跨境卫士”这个词当然是保障跨境人账号安全的意思&#xff0c;为跨境电商打造的跨境卫士&#xff0c;说白了就是专门为跨境电商商家解决各种痛点的软件工具&#xff0c;那一说到这类软件工具&#xff0c;很多人脑海中第一时间想到的是什么&#xff1f;相信都会出现“指纹浏览…

zabbix日志监控:操作系统、业务系统、文件大小、多行日志

zabbix日志监控&#xff1a;操作系统、业务系统、文件大小、多行日志 目录1 监控操作系统日志2 监控业务系统日志具体要求&#xff1a;分析&#xff1a;操作&#xff1a;3 监控日志文件大小&#xff08;1&#xff09;在被管主机当中安装agent&#xff08;2&#xff09;在以下za…

第五天(渐变)

文章目录笔记第五章 ⻚⾯布局5.1弹性盒⼦练习题目&#xff08;使用实现学校官网的首页面&#xff09;效果截图项目反思&#xff1a;笔记 其他效果 渐变<!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><s…

「JVS低代码开发平台」设备维保到期自动提醒配置介绍

配置需求 构建一个 对设备管理的界面&#xff0c;在新增设备时&#xff0c;能录入设备到期的时间&#xff0c;发起维保后&#xff0c;能修改下次设备到期的时间&#xff0c;维保的状态系统自动根据当前时间和维保到期时间&#xff0c;自动调整。 整体配置思路 1、配置设备管理…

leecode#x平方根#爬楼梯

题目描述&#xff1a; 给你一个非负整数 x &#xff0c;计算并返回 x 的 算术平方根 。 由于返回类型是整数&#xff0c;结果只保留 整数部分 &#xff0c;小数部分将被 舍去 。 注意&#xff1a;不允许使用任何内置指数函数和算符&#xff0c;例如 pow(x, 0.5) 或者 x ** 0…

stm32cubemx hal学习记录:FreeRTOS信号量

一、基本配置 1、配置RCC、USART1、时钟84MHz 2、配置SYS&#xff0c;将Timebase Source修改为除滴答定时器外的其他定时器。 3、初始化LED的两个引脚、两个按键引脚 4、开启FreeRTOS&#xff0c;v1与v2版本不同&#xff0c;一般选用v1即可 5、创建二值信号量Binary Semap…

IPv6通信实验

♥️作者&#xff1a;小刘在C站 ♥️每天分享云计算网络运维课堂笔记&#xff0c;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的&#xff0c;绽放。 目录 实验命令指南 1&#xff09;配置ip地址 在r2上&#xff1a; 在r3上&#xff1a;…

TDengine

目录1、在linux上安装服务端2、在本地安装客户端3、通过Idea连接服务端4、控制台基本使用5、流式计算1、在linux上安装服务端 1、首先下载服务端&#xff0c;我下载的是&#xff1a; TDengine-server-2.6.0.30-Linux-x64.tar.gz 下载地址 2、下载过后传到虚拟机。并解压 3、运…