目录

1.1. 协处理器—Coprocessor

1.2. Observer

1.3. Endpoint Endpoint

1.4. 协处理加载方式

1.4.1. 静态加载

1.4.2. 静态卸载

1.4.3. 动态加载

1.4.4. 协处理器卸载

2. 二级索引(ObserverCoprocessor案例)



 HBase高级编程

在使用 HBase 时,如果你的数据量达到了数十亿行或数百万列,此时能否在查询中返回大量数据将受 制于网络的带宽,即便网络状况允许,但是客户端的计算处理也未必能够满足要求。在这种情况下,协 处理器(Coprocessors)应运而生。它允许你将业务计算代码放入在 RegionServer 的协处理器中,将 处理好的数据再返回给客户端,这可以极大地降低需要传输的数据量,从而获得性能上的提升。同时协 处理器也允许用户扩展实现 HBase 目前所不具备的功能,如权限校验、二级索引、完整性约束等。

1.1. 协处理器—Coprocessor

1、 起源 HBase作为列族数据库最经常被人诟病的特性包括:无法轻易建立“二级索引”,难以执行求和、计数、 排序等操作。于是,HBase在0.92之后引入了协处理器 (coprocessors),实现一些激动人心的新特性:能够轻易建立二次索引、复杂过滤器(谓词下推)以及访 问控制等。

2、协处理器有两种:observer 和 endpoint

1.2. Observer

Observer 协处理器类似于关系型数据库中的触发器,当发生某些事件的时候这类协处理器会被 Server 端调用。通常可以用来实现下面功能:

1、权限校验:在执行 Get 或 Put 操作之前,您可以使用 preGet 或 prePut 方法检查权限; 2、完整性约束: HBase 不支持关系型数据库中的外键功能,可以通过触发器在插入或者删除数据的时候, 对关联的数据进行检查; 3、二级索引: 可以使用协处理器来维护二级索引。

类似于传统数据库中的触发器,当发生某些事件的时候这类协处理器会被 Server 端调用。Observer Coprocessor 就是一些散布在 HBase Server端代码中的 hook 钩子,在固定的事件发生时被调用。比 如:put 操作之前有钩子函数 prePut,该函数在put操作执行前会被 RegionServer 调用;在 put 操作 之后则有 postPut 钩子函数

以HBase0.92版本为例,它提供了三种观察者接口:

● RegionObserver:提供客户端的数据操纵事件钩子:Get、Put、Delete、Scan等。

● WALObserver:提供WAL相关操作钩子,允许您观察与预写日志(WAL)相关的事件。

● MasterObserver:提供DDL-类型的操作钩子。如创建、删除、修改数据表等。

到0.96版本又新增一个RegionServerObserver,允许您观察与 RegionServer 操作相关的事件,例如启 动,停止或执行合并,提交或回滚。

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

1.3. Endpoint Endpoint

协处理器类似于关系型数据库中的存储过程。客户端可以调用 Endpoint 协处理器在服务端对 数据进行处理,然后再返回。

以聚集操作为例,如果没有协处理器,当用户需要找出一张表中的最大数据,即 max 聚合操作,就必 须进行全表扫描,然后在客户端上遍历扫描结果,这必然会加重了客户端处理数据的压力。利用 Coprocessor,用户可以将求最大值的代码部署到 HBase Server 端,HBase 将利用底层 cluster 的多 个节点并发执行求最大值的操作。即在每个 Region 范围内执行求最大值的代码,将每个 Region 的最 大值在 Region Server 端计算出来,仅仅将该 max 值返回给客户端。之后客户端只需要将每个 Region 的最大值进行比较而找到其中最大的值即可。

协处理器类似传统数据库中的存储过程,客户端可以调用这些Endpoint协处理器执行一段Server端代 码,并将Server端代码的结果返回给客户端进一步处理,最常见的用法就是进行聚集操作。如果没有协 处理器,当用户需要找出一张表中的最大数据,即 max 聚合操作,就必须进行全表扫描,在客户端代 码内遍历扫描结果,并执行求最大值的操作。这样的方法无法利用底层集群的并发能力,而将所有计算 都集中到Client端统一执行,势必效率低下。利用 Coprocessor,用户可以将求最大值的代码部署到 HBase Server端,HBase 将利用底层cluster的多个节点并发执行求最大值的操作。即在每个Region范 围内执行求最大值的代码,将每个Region的最大值在Region Server端计算出,仅仅将该max值返回给 客户端。在客户端进一步将多个Region的最大值进一步处理而找到其中的最大值。这样整体的执行效率 就会提高很多。

下图是EndPoint的工作原理:

总结

Observer允许集群在正常的客户端操作过程中可以有不同的行为表现

Endpoint允许扩展集群的能力,对客户端应用开放新的运算命令

observer类似于RDBMS中的触发器,主要在服务端工作

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

observer可以实现权限管理、优先级设置、监控、ddl控制、二级索引等功能

endpoint可以实现min、max、avg、sum、distinct、group by等功能

1.4. 协处理加载方式

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

静态加载的协处理器称之为System Coprocessor,动态加载的协处理器称之为Table Coprocessor

1.4.1. 静态加载

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

<property>
<name>hbase.coprocessor.region.classes</name>
<value>com.nx.hbase.coprocessor.endpoint.SumEndPoint</value>
</property>

标签的值必须是下面其中之一:

RegionObservers 和 Endpoints 协处理器: hbase.coprocessor.region.classes WALObservers 协处理器: hbase.coprocessor.wal.classes

MasterObservers 协处理器: hbase.coprocessor.master.classes

必须是协处理器实现类的全限定类名。如果为加载指定了多个类,则类名必须以逗号分隔。

第二步:将 jar(包含代码和所有依赖项) 放入 HBase 安装目录中的 lib 目录下;

第三步:重启 HBase

1.4.2. 静态卸载

1、从 hbase-site.xml 中删除配置的协处理器的元素及其子元素;

2、从类路径或 HBase 的 lib 目录中删除协处理器的 JAR 文件(可选);

3、重启 HBase。

1.4.3. 动态加载

使用动态加载协处理器,不需要重新启动 HBase。但动态加载的协处理器是基于每个表加载的,只能用 于所指定的表。 此外,在使用动态加载必须使表脱机(disable)以加载协处理器。动态加载通常有两 种方式:Shell 和 Java API 。

以下示例基于两个前提:

1、coprocessor.jar 包含协处理器实现及其所有依赖项。

2、 JAR 包存放在 HDFS 上的路径为:hdfs://:/user//coprocessor.jar

启用表aggregation,只对特定的表生效。通过HBase Shell 来实现。

◆ disable指定表。

hbase> disable 'mytable'

◆ 添加aggregation

hbase> alter 'mytable', METHOD => 'table_att', 'coprocessor'=>'hdfs://:/user//coprocessor.jar|org.apache.Hadoop.hbase.coprocessor.AggregateImplementatio n|1085541823|arg1=1,arg2=2'

Coprocessor 包含由管道(|)字符分隔的四个参数,按顺序解释如下:

1、JAR 包路径:通常为 JAR 包在 HDFS 上的路径。关于路径以下两点需要注意: 允许使用通配符,例如: hdfs://:/user//*.jar 来添加指 定的 JAR 包; 可以使指定目录,例如: hdfs://:/user// ,这会添加目录 中的所有 JAR 包,但不会搜索子目录中的 JAR 包。

2、类名:协处理器的完整类名。

3、优先级:协处理器的优先级,遵循数字的自然序,即值越小优先级越高。可以为空,在这种情况下,将分 配默认优先级值。

4、可选参数 :传递的协处理器的可选参数。

◆ 重启指定表

hbase> enable 'mytable'

◆ 验证协处理器是否已加载

hbase > describe 'mytable'

协处理器出现在 TABLE_ATTRIBUTES 属性中则代表加载成功。

1.4.4. 协处理器卸载

只需要三步即可:

1、禁用表

disable 'mytable'

2、移除表协处理器

alter 'mytable', METHOD=>'table_att_unset', NAME=>'coprocessor$1'

3、启用表

enable 'mytable'

2. 二级索引(ObserverCoprocessor案例)

RowKey 在 HBase 中是以 B+Tree 结构化有序存储的,所以 scan 起来会比较效率。单表以 RowKey 存 储索引,column value存储id值或其他数据,这就是Hbase索引表的结构。

由于HBase本身没有二级索引(Secondary Index)机制,基于索引检索数据只能单纯地依靠 RowKey,为了能支持多条件查询,开发者需要将所有可能作为查询条件的字段一一拼接到RowKey 中,这是HBase开发中极为常见的做法

在社交类应用中,经常需要快速检索各用户的关注列表guanzhu,同时,又需要反向检索各种户的粉丝 列表fensi,为了实现这个需求,最佳实践是建立两张互为反向的表:

一个表为正向索引关注表: “guanzhu”:

Rowkey: a

f1:from b

另一个表为反向索引粉丝表:“fensi“:

Rowkey: b

f1:from a

建表语句:

create 'guanzhu','cf1'

create 'fensi','cf1'

实现效果: 往 guanzhu 表插入一条数据

put 'guanzhu','a','cf1:from','b'

就会自动往 fensi 表插入一条数据,自动被触发了执行类似下面的这条语句

put 'fensi','b','cf1:from','a'

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

代码后续补上

一篇看懂hbase协处理器相关推荐

  1. 新一配:一篇看懂加油站产业链解决方案

    新一配:一篇看懂加油站产业链解决方案的文章 一.加油站市场规模 截至2018年9月,全国机动车保有量达3.22亿辆,机动车驾驶人达4.03亿人.在这庞大的汽车生活消费生态链中,加油是汽车消费必不可少的 ...

  2. 阿联酋外汇业务的监管宽松?一篇看懂如何在阿联酋做外汇交易!

    阿联酋外汇业务的监管宽松?一篇看懂如何在阿联酋做外汇交易! 因为互联网技术的高速发展,个体交易者现在可以通过国际银行或经纪人轻松地进入外汇市场.就每日交易量而言,外汇市场可以称之为是世界上最大的市场. ...

  3. 【astron转载】一张图看懂HBase

    华为总结的HBase确实很经典.今天看了HBase权威指南中的架构章节.虽然没看完,但是看了这个图后,有种醍醐灌顶的感觉.后面继续看权威指南.有没有像一张图看懂XX财报的感觉.京东和阿里的同学应该经常 ...

  4. 卡尔曼滤波,最最容易理解的讲解.找遍网上就这篇看懂了(转载)

    学习卡尔曼滤波看了4天的文章,硬是没看懂.后来找到了下面的文章一下就看懂了. 我对卡尔曼滤波的理解, 我认为,卡尔曼滤波就是把统计学应用到了滤波算法上. 算法的核心思想是,根据当前的仪器"测 ...

  5. 【Google 开发者大会】一篇看懂 TensorFlow 如何助力高效开发

    代码不止 精彩不断! 刚圆满结束的谷歌开发者大会, 为大家带来了 TensorFlow 机器学习专场技术演讲 那么 TensorFlow 有哪些新鲜出炉的技术优化呢? 点击下面视频,带你1分钟看懂机器 ...

  6. 卡尔曼滤波,最最容易理解的讲解.找遍网上就这篇看懂了.

    学习卡尔曼滤波看了4天的文章,硬是没看懂.后来找到了下面的文章一下就看懂了. 我对卡尔曼滤波的理解, 我认为,卡尔曼滤波就是把统计学应用到了滤波算法上. 算法的核心思想是,根据当前的仪器"测 ...

  7. pyqt5从子目录加载qrc文件_【JVM系统学习之路】一篇看懂类加载

    JVM系统学习之路系列演示代码地址:https://github.com/mtcarpenter/JavaTutorial 嗨喽,小伙伴大家好,我是小春哥,今天是打卡 [JVM系统学习之路] 的第二篇 ...

  8. d盘不能扩展卷_一篇看懂!Linux磁盘的管理(分区、格式化、挂载),LVM逻辑卷,RAID磁盘阵列...

    Linux中磁盘的管理(分区.格式化.挂载),LVM逻辑卷,RAID磁盘阵列 一.认识磁盘 1.什么是磁盘: 磁盘是一种计算机的外部存储器设备,由一个或多个覆盖有磁性材料的铝制或玻璃制的碟片组成,用来 ...

  9. 一篇看懂CVPR 2017五大研究前沿 | 腾讯AI Lab深度解析

    感谢阅读腾讯AI Lab微信号第二篇文章,我们将深度解析本届CVPR热门研究.第一部分是五大前沿领域的重点文章解析,包括低中层视觉.图像描述生成.3D视觉.计算机视觉与机器学习.弱监督下的图像识别等. ...

最新文章

  1. PCA(1):基础知识介绍
  2. java垃圾回收机制_笔记 | Java垃圾回收机制
  3. Apache Commons Math3学习笔记(2) - 多项式曲线拟合(转)
  4. 开发日记-20190827 关键词 计算机网络
  5. jquery动态加载问题
  6. 困境中的帮助者与被助者
  7. 屏蔽预训练模型的权重。 只训练最后一层的全连接的权重。_权重/参数初始化...
  8. python 动态编译代码,Python:在运行时动态创建函数
  9. oracle手注,oracle手注
  10. 解决php无法上传大文件问题
  11. python twisted应用_如何通过Python(而不是通过Twisted)运行Twisted应用程序?
  12. NOIP2017 Day1 T3 逛公园
  13. (已解决)Mon Apr 08 14:02:29 CST 2019 WARN: Establishing SSL connection without server's
  14. Atitit 遍历 与循环模式大总结 目录 1.1. 遍历的对象 数组 或对象 或对象数组 1 2. 遍历的概念 2 2.1. 祖先后代同胞 过滤 2 3. 常见的遍历四种方式 2 3.1.
  15. PHOTOSHOP教程
  16. python图像量化及采样处理
  17. C++验证奇偶性时求余运算%和位运算的速度比较
  18. 大学计算机试题深圳大学,深圳大学期末考试试卷参考答案.doc
  19. K8S学习之容器探测 livenessProbe、readinessProbe、startupProbe、lifecycle
  20. 《呼吸法门精要》南师所讲。读后感

热门文章

  1. Stream跑分测试使用-输出结果查看
  2. 五款高颜值蓝牙耳机推荐,学生党百元级值得入手的蓝牙耳机
  3. day8-C++学习
  4. 设置Typora图床(Github)
  5. mybatis动态SQL增删改查
  6. java 超过long_Java之超过long型范围的大数运算
  7. 浏览器精确定位 调用高德地图定位
  8. 异常检测(二)——IsolationForest
  9. 我们无法创建新的分区也找不到现有的分区--解决方案
  10. java整数划分递归_整数划分(递归)