一、产生背景

Hbase作为列族数据库最经常被人诟病的特性包括:无法轻易建立“二级索引”,难以执行求和、计数、排序等操作。比如,在旧版本的(<0.92)Hbase中,统计数据表的总行数,需要使用 Counter 方法,执行一次 MapReduce Job 才能得到。虽然 HBase在数据存储层中集成了 MapReduce,能够有效用于数据表的分布式计算。然而在很多情况下,做一些简单的相加或者聚合计算的时候,如果直接将计算过程放置在 server 端,能够减少通讯开销,从而获得很好的性能提升。
于是,HBase 在 0.92之后引入了协处理器(coprocessors),实现一些激动 人心的新特性:能够轻易建立二次索引、复杂过滤器(谓词下推)以及访问控制等。


二、协处理器(Coprocessor)的分类

协处理器有两种:observerendpoint

1、observer

observer类似于mysql中的触发器,zookeeper中的监听器,主要的作用是当执行被监听的一个操作的时候可以触发另一个我们需要的操作的依赖关系,比如说监听数据库数据的增删过程,我们可以在hbase数据库插入数据或者删除数据之前或之后进行一系列的操作(ps:有很多博客说的是钩子函数,其实没错,但是便于理解,这里就不引入钩子的概念了)

1.1observer接口

以HBase0.92 版本为例,它提供了三种观察者接口:
● RegionObserver:提供客户端的数据操纵事件钩子:Get、Put、Delete、Scan 等。
● WALObserver:提供 WAL(写前日志write ahead log)相关操作钩子。
● MasterObserver:提供 DDL-类型的操作钩子,如创建、删除、修改数据表等。
到 0.96 版本又新增一个 RegionServerObserver

1.2Observer协处理器的原理

以 RegionObserver 为例子(图来源网络,如若侵权,请原作者联系删除):

流程说明:
1、客户端发出 put 请求
2、该请求被分派给合适的 RegionServer 和 region
3、coprocessorHost 拦截该请求,然后在该表上登记的每个RegionObserver 上调用 prePut()
4、如果没有被 prePut()拦截,该请求继续送到 region,然后进行处理
5、region 产生的结果再次被 CoprocessorHost 拦截,调用 postPut()
6、假如没有 postPut()拦截该响应,最终结果被返回给客户端

2、Endpoint

Endpoint 协处理器类似传统数据库中的存储过程,客户端可以调用这些 Endpoint 协处理器执行一段 Server端代码,并将Server 端代码的结果返回给客户端进一步处理,最常见的用法就是进行聚集操作。

在这里有个概念需要跟大家说一下,叫[谓词下推],大家知道传统型数据库如mysql,在执行聚合函数的时候是将数据从数据库拉取到客户端本地然后再进行聚合操作,这个聚合的动作是发生在客户端的,这样的操作在大数据环境下就显得有点尴尬了,这个过程如果变成数据在哪里计算就在哪里的话这就很完美了,能很好的利用大数据的分布式环境,而[谓词下推]呢就是每个服务器节点计算自己的数据,计算完成后将结果发给客户端进行最终的汇总,这就是endpoint协处理器大致的处理流程

3、小总结

两种协处理器的区别:

observer 类似于 RDBMS 中的触发器,主要在服务端工作
endpoint 类似于 RDBMS 中的存储过程,主要在服务端工作

Observer 允许集群在正常的客户端操作过程中可以有不同的行为表现 Endpoint 允许扩展集群的能力,对客户端应用开放新的运算命令
observer 可以实现权限管理、优先级设置、监控、ddl 控制、二级索引等功能 endpoint 可以实现min、max、avg、sum、distinct、group by 等功能

三、协处理加载方式

协处理器的加载方式有两种,我们称之为静态加载方式(Static Load)和动态加载方式 (Dynamic Load)。静态加载的协处理器称之为 System Coprocessor,动态加载的协处理器称 之为 Table Coprocessor

1、 静态加载

通过修改 hbase-site.xml 这个文件来实现,启动全局 aggregation,能过操纵所有的表上的数据。只需要添加如下代码:

<property><name>hbase.coprocessor.user.region.classes</name><value>org.apache.hadoop.hbase.coprocessor.AggregateImplementation</value>
</property>

为所有 table 加载了一个 cp class,可以用”,”分割加载多个 class
注意: 该方法因为是全局的,所以在实际应用中并不是很多,而另一种方法用的会更多一些

2、动态加载

启用表 aggregation,只对特定的表生效。通过 HBase Shell 来实现。
①disable 指定表。hbase> disable ‘table名’;
②添加 aggregation

hbase> alter 'mytable', METHOD => 'table_att','coprocessor'=>
'|org.apache.Hadoop.hbase.coprocessor.AggregateImplementation||'

必要参数解释(两个竖杠分隔符|):
第一段 第一个|之前 jar包位置 hdfs的路径
第二段 jar包的协处理器的权限定名
第三段 协处理器的优先级别,同一个表中添加多个协处理器,优先级问题 使用数字表示,数字越大代表优先级越高
第四段 第三个|之后 代码中程序的参数,没有不传

③重启指定表 hbase> enable ‘table名’

3、协处理器卸载

禁用表      disable 'mytable'
卸载        alter 'mytable',METHOD=>'table_att_unset',NAME=>'coprocessor$1'
启用表      enable 'mytable'

四、二级索引(ObserverCoprocessor 案例)

1、需求:

在社交类应用中,经常需要快速检索各用户的关注列表,同时,又需要反向检索各种用户的粉丝列表,为了实现这个需求,最佳实践是建立两张互为反向的表:
一个表为正向索引关注表:“user_mingxing”:
Rowkey: a
f1:from b
另一个表为反向索引粉丝表:“mingxing_user”:
Rowkey: b
f1:from a
建表语句:
create ‘user_mingxing’,‘cf1’
create ‘mingxing_user’,‘cf1’
实现效果:往 user_mingxing 表插入一条数据,就会自动往 mingxing_user 表插入一条数据 put ‘user_mingxing’,‘a’,‘cf1:from’,‘b’
put ‘mingxing_user’,‘b’,‘cf1:from’,‘a’

插入一条关注信息时,为了减轻应用端维护反向索引表的负担,可用 Observer 协处理器实现:

2、具体实现步骤

2.1代码实现

import java.io.IOException;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.Durability;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.coprocessor.BaseRegionObserver;
import org.apache.hadoop.hbase.coprocessor.ObserverContext;
import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment;
import org.apache.hadoop.hbase.regionserver.wal.WALEdit;public class SecondryIndex extends BaseRegionObserver{static Configuration conf = null;static Connection conn = null;static HTable table = null;static {try {conf = HBaseConfiguration.create();conf.set("hbase.zookeeper.quorum", "hadoop01:2181,hadoop02:2181,hadoop03:2181");conn = ConnectionFactory.createConnection(conf);table = (HTable) conn.getTable(TableName.valueOf("mingxing_user"));} catch (IOException e) {e.printStackTrace();}}/** 协处理  触发的时候 调用的方法 * 插入数据之后  返回给客户端之前   拦截插入的数据    进行指定操作  * 向索引表插入数据* 参数1:上下文对象   环境变量* 参数2:put对象  协处理器  拦截的put对象*      插入原始表的数据 * 参数3:生命周期* 向  user_mingxing * put "user_mingxing","rk001","info:name","luhan"*/@Overridepublic void postPut(ObserverContext<RegionCoprocessorEnvironment> e, Put put, WALEdit edit, Durability durability)throws IOException {//需要解析对象,原始表对象byte[] row = put.getRow();Cell cv = put.get("info".getBytes(), "name".getBytes()).get(0);byte[] value = cv.getValue();//数据插入新表//将对象  rk v 分别封装到  mingixng_user表 rk vPut newput =new Put(value);newput.add("info".getBytes(), "fensi".getBytes(), row);table.put(newput);table.close();}}

2.2打成jar包(jar包名字.jar),上传到 hdfs 中目录下

hadoop fs -put test.jar /hbaseJar

2.3禁用表disable ‘表名’

disable 'user_mingxing'

2.4添加 aggregation 协处理器

hbase> alter 'user_mingxing', METHOD =>
'table_att','coprocessor'=>
'hdfs://高可用namenode组名/hbaseJar/test.jar|com.aura.cn.secondaryIndex.SecondryIndex|100|'

2.5重启指定表

hbase> enable 'user_mingxing'

2.6验证协处理器是否加载成功

查看表的详细信息:

desc user_mingxing;

会出现以下信息,说明添加成功:

user_mingxing, {TABLE_ATTRIBUTES =>
{coprocessor$1 => 'hdfs://高可用namenode组名/jars/test.jar|com.aura.cn.secondaryIndex.SecondryIndex|100|'}

$1协处理器的编号,从1开始顺序递增,每一个协处理器的唯一标识

2.7向user_mingxing 这个表导入数据

检查 mingxing_user(在java代码中指定的) 表数据是否存在

hbase的协处理器相关推荐

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

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

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

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

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

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

  4. Hbase使用协处理器的注意点

    Hbase使用协处理器的注意点 1. 协处理器在使用时如果代码出错会使,hbase的节点死掉当节点死掉可以重启服务,删除挂载协处理器的表,或者是卸载协处理器2. 协处理器是在使用时对同一张表的操作是不 ...

  5. hbase使用协处理器同步es

    hbase同步到es hbase版本:1.1.2 es版本:6.3.2 一开始从网上找的也能用,但是发现运行一段时间发现报错,丢失数据,后来又从网上搜索加上自己整理的,终于成功了 不多说上代码 pub ...

  6. hbase自定义协处理器实现

    hbase自定义协处理器实现 首先编写代码,继承BaseRegionObserver,在代码中添加输出信息到/opt/apps/hbase_logs/hbase.log,如果协处理器生效,就会输出信息 ...

  7. 给hbase增加协处理器报ERROR: org.apache.hadoop.hbase.DoNotRetryIOException:错误

    刚开始,我输入协处理器的语法是这样子输入的(隔了好几天,我又用这个语法,又能行了,郁闷): alter 'publicDataset:comment',METHOD =>'table_att', ...

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

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

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

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

  10. Hbase Coprocessors 协处理器

    Table of Contents Hbase 协处理器的概述 与其他协处理器的比较 Triggers and Stored Procedure MapReduce AOP 协处理器如何实现 Copr ...

最新文章

  1. 文件以附件形式下载的方法
  2. 当session会话结束时,重定向到登录页显示在iframe框内的问题
  3. 使用Jetty设置JNDI(嵌入式)
  4. java----IO和NIO的区别
  5. Ubuntu Linux系统下搭建自己的Web服务器
  6. 砥志研思SVM(二) 拉格朗日乘子法与KKT条件
  7. Youtube最佳Red5 官方视频下载指南,字幕【亲测成功】
  8. java读取配置文件properties_让我来告诉你Spring框架是怎么样通过properties来获得对象的?...
  9. 将android界面背景设置为黑色
  10. devc c语言调用图片,DevC++中使用EGE图形库
  11. dosbox下载并配置masm环境变量的方法
  12. 别错过,卡方检验实用总结!
  13. 为什么是NoSQL数据库?
  14. 水晶易表 oracle,水晶易表和水晶报表的区别
  15. ERD Online 4.0.0新版本震撼来袭,超强国产免费在线数据建模系统
  16. java swing是什么_JAVA初学者:swing是什么?
  17. 计算机cpu天体图,CPU天梯图2019年11月最新版 台式电脑处理器性能排名与选购建议...
  18. html使用视频给网页做背景
  19. 牛客每日练习----分元宵,送分啦-QAQ,字符串的问题
  20. 数据可视化Matplotlib库

热门文章

  1. 在万能地图下载器中如何不显示谷歌电子地图上的地名文字?
  2. 华为手机计算机快捷设置密码,华为手机首次重启绘制图案密码后让输入解锁密码。我没有设置呀?怎么办...
  3. 阿里巴巴Java性能调优实战(2021华山版)
  4. Logback最佳实践和使用指导
  5. ASCⅡ码与字符的相互转化
  6. 【华为】职级、薪酬、绩效全认知
  7. 灵格斯怎么屏幕取词_灵格斯词霸怎么屏幕取词
  8. 布客·ApacheCN 翻译/校对/笔记整理活动进度公告 2020.1
  9. ubuntu16.04 更新pip
  10. 易语言列表框防止项目重复加入列表框