Hbase协处理器

产生背景

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

协处理器(Coprocessor)分类

  1. Observer

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

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

    • RegionObserver:

      • 用户可以用这种的处理器处理数据修改事件,它们与表的region联系紧密。
    • MasterObserver:

      • 可以被用作管理或DDL类型的操作,这些是集群级事件。
    • WALObserver:

      • 提供控制WAL的挂钩函数
    • Observer提供了一些设计好的回调函数,每个操作在集群服务器端都可以被调用。

  2. Endpoint

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

    • Endpoint通过添加一下远程过程调用来动态扩展RPC协议。可以把它们理解为与RDBMS中类似的存储过程。

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

    • 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 进行拼接, 这样就可以查询到我们要的数据。

posted @ 2019-11-18 20:42  wellDoneGaben  阅读(219)  评论(0编辑  收藏  举报