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

  • 相关阅读:
    oracle归档空间不足的问题(rman删除归档日志)
    oracle DG查看延时时间
    Convert JS object to JSON string
    转:微信公众平台开发(80) 上传下载多媒体文件
    生成带参数的二维码
    关闭微信浏览器可以使用
    微信内置浏览器的JsAPI(WeixinJSBridge续)进入全屏
    如何隐藏微信公众平台右上角按钮
    微信公众平台服务号、订阅号的相关说明选择字号:
    微信公众平台群发消息的方法及注意事项
  • 原文地址:https://www.cnblogs.com/ronnieyuan/p/11884933.html
Copyright © 2011-2022 走看看