Hbase 协处理器

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

Observer协处理器

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

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

Observer 协处理器有以下四种类型:

  • RegionObserver : 允许观察 Region 上的事件,例如 Get 和 Put 操作。
  • RegionServerObserver : 允许观察与 RegionServer 操作相关的事件,例如启动,停止或执行合并,提交或回滚。
  • MasterObserver : 允许观察与 HBase Master 相关的事件,例如表创建,删除或 schema 修改。
  • WalObserver : 允许观察与预写日志(WAL)相关的事件。

执行流程

  

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

Endpoint协处理器

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

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

  • 静态加载的协处理器称之为 System Coprocessor(系统级协处理器),作用范围是整个 HBase 上的所有表,需要重启 HBase 服务;
  • 动态加载的协处理器称之为 Table Coprocessor(表处理器),作用于指定的表,不需要重启 HBase 服务。

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

HBase Shell动态加载

  1. 使用 HBase Shell 禁用表
hbase > disable 'tableName'
  1. 使用如下命令加载协处理器
hbase > alter 'tableName', METHOD => 'table_att', 'Coprocessor'=>'hdfs://<namenode>:<port>/
user/<hadoop-user>/coprocessor.jar| org.myname.hbase.Coprocessor.RegionObserverExample|1073741823|
arg1=1,arg2=2'

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

  • JAR 包路径:通常为 JAR 包在 HDFS 上的路径。关于路径以下两点需要注意:

  • 允许使用通配符,例如:hdfs://<namenode>:<port>/user/<hadoop-user>/*.jar 来添加指定的 JAR 包;

  • 可以使指定目录,例如:hdfs://<namenode>:<port>/user/<hadoop-user>/ ,这会添加目录中的所有 JAR 包,但不会搜索子目录中的 JAR 包。

  • 类名:协处理器的完整类名。

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

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

  1. 启用表
hbase > enable 'tableName'
  1. 验证协处理器是否已加载
hbase > describe 'tableName'

HBase Shell动态卸载

  1. 禁用表
hbase> disable 'tableName'
  1. 移除表协处理器
hbase> alter 'tableName', METHOD => 'table_att_unset', NAME => 'coprocessor$1'
  1. 启用表
hbase> enable 'tableName'

   

posted on 2022-05-21 23:31  溪水静幽  阅读(291)  评论(0)    收藏  举报