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 進行拼接, 這樣就能夠查詢到咱們要的數據。

相關文章
相關標籤/搜索