Hbase协处理器

产生背景

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

协处理器(Coprocessor)分类

  1. Observersql

    • 这一类协处理器与触发器(trigger)相似:回调函数(也被称做钩子函数,hook)在一些特定事件发生时被执行。这些事件包括一些用户产生的事件,也包括服务器端内部自动产生的事件。数据库

    • 协处理器框架提供的接口以下:apache

    • RegionObserver:
      • 用户能够用这种的处理器处理数据修改事件,它们与表的region联系紧密。
    • MasterObserver:
      • 能够被用做管理或DDL类型的操做,这些是集群级事件。
    • WALObserver:
      • 提供控制WAL的挂钩函数
    • Observer提供了一些设计好的回调函数,每一个操做在集群服务器端均可以被调用。服务器

  2. Endpoint框架

    • 除了事件处理以外还须要将用户自定义操做添加到服务器端。用户代码能够被部署到管理数据的服务器端,例如,作一些服务器端计算的工做。分布式

    • Endpoint经过添加一下远程过程调用来动态扩展RPC协议。能够把它们理解为与RDBMS中相似的存储过程。函数

    • 客户端能够调用这些 Endpoint 协处理器执行一段 Server端代码,并将Server 端代码的结果返回给客户端进一步处理,最多见的用法就是进行汇集操做(谓词下推)。oop

    • Endpoint能够与observer的实现组合起来直接做用于服务器端的状态。性能

  3. Observer 与 Endpoint总结设计

    • 两种协处理器的区别:

      • observer 相似于 RDBMS 中的触发器,主要在服务端工做
      • endpoint 相似于 RDBMS 中的存储过程,主要在服务端工做
      • Observer 容许集群在正常的客户端操做过程当中能够有不一样的行为表现 Endpoint 容许扩展集群的能力,对客户端应用开放新的运算命令
      • observer 能够实现权限管理、优先级设置、监控、ddl 控制、二级索引等功能 endpoint 能够实现min、max、avg、sum、distinct、group by 等功能
  4. 协处理器加载方式

    • 协处理器的加载方式有两种:

    • 静态加载方式(Static Load)
      - 静态加载的协处理器称之为 System Coprocessor
    • 动态加载方式 (Dynamic Load)
      - 动态加载的协处理器称 之为 Table Coprocessor

    • 静态加载

      • 经过修改 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。

      • 但因为该方法是全局的,因此在实际应用中并非不少,而动态加载用的更多一些。

    • 动态加载

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

      • disable 指定表

      ```sh
          hbase> disable 'table名';
      ```
      • 添加 aggregation
      ```sh
          hbase> alter 'mytable', METHOD => 'table_att','coprocessor'=>
          '(1) org.apache.Hadoop.hbase.coprocessor.AggregateImplementation(2)(3)(4)' 
      ```
      
      - 参数解释: 
        - (1):  jar包位置 hdfs的路径 
        - (2):  jar包的协处理器的权限定名 
        - (3):  协处理器的优先级别( 同一个表中添加多个协处理器,优先级问题 使用数字表示,数字越大表明优先级越高 ) 
        - (4):  代码中程序的参数,没有不传
      • 重启指定表
      ```sh
          hbase> enable 'table名';
      ```
    • 协处理器卸载

      • 禁用表

        disable 'mytable'
      • 卸载

        alter 'mytable',METHOD=>'table_att_unset',NAME=>'coprocessor$1'
      • 启用表

        enable 'mytable'
  5. 协处理器查询加盐以后的表

    • 因为每一个Region中实际上是有Start Key 和 End Key的, 它们是由咱们所建立的表指定的, 而协处理器的代码实际上是在每一个Region中执行的。

    • 这些代码在Region里面执行的时候是能够拿到当前Region的信息的, 包括了Start Key 和 End Key。

    • 咱们只要将拿到的Start Key 信息和查询的 UID 进行拼接, 这样就能够查询到咱们要的数据。

相关文章
相关标签/搜索