hbase實踐之協處理器Coprocessor

HBase客戶端查詢存在的問題

  • Scan
    用Get/Scan查詢數據,
  • Filter
    用Filter查詢特定數據

以上狀況只適合幾千行數據以及不是不少的列的「小數據」。html

當表擴展爲億萬行及百萬列時,在經過網絡傳遞移動大量的數據致使網絡擁堵,且客戶端須要足夠多內存來處理這麼大量數據的計算操做,另外,客戶端代碼也會變的大而複雜。ios

解決方案

移動計算比移動數據更划算git

Coprocessor將運算移動到數據所處的節點。github

什麼是Coprocessor?

簡單來講,Coprocessor是一個框架,這個框架可讓你很容易地在Region Server運行你的業務邏輯代碼。web

Coprocessor類比

  • Triggers and Stored Procedure
    • Observer Coprocessor –> RDBMS 中的觸發器
    • EndPoint Coprocessor –> RDBMS中的存儲過程
  • MapReduce

MapReduce 和 Coprocessor有同樣的操做原則,計算向數據靠攏。數據庫

  • AOP

相似面向切面編程,Coprocessor就像應用Advice,在傳遞請求到最終的目的地以前,經過攔截一個請求後運行相同的代碼。apache

Coprocessor分類

Observer Coprocessor

在一個特定的事件發生前或發生後觸發。編程

  • 在事件發生前觸發的Coprocessor須要重寫以pre做爲前綴的方法,好比prePut。
  • 在事件發生後觸發的Coprocessor使用方法以post做爲前綴,好比postPut。

Endpoint

是一個遠程rpc調用,相似於webservice形式調用,但他不適用xml,而是使用的序列化框架是protobuf(序列化後數據更小).安全

區別:Observer像是個觸發器,到某個條件Region就去執行用戶代碼,用戶從主觀來講是沒法控制的;EndPoint就是遠程調用,用戶能夠在客戶端遠程調用執行本身的代碼。網絡

Observer Coprocessor使用場景與實現

Observer Coprocessor的使用場景以下:
安全性:在執行Get或Put操做前,經過preGet或prePut方法檢查是否容許該操做;
引用完整性約束:HBase並不直接支持關係型數據庫中的引用完整性約束概念,即一般所說的外鍵。可是咱們可使用Coprocessor加強這種約束。好比根據業務須要,咱們每次寫入user表的同時也要向user_daily_attendance表中插入一條相應的記錄,此時咱們能夠實現一個Coprocessor,在prePut方法中添加相應的代碼實現這種業務需求。
二級索引:可使用Coprocessor來維持一個二級索引。這裏暫不展開,有時間會單獨說明。

Observer在Hbase中主要分爲四類,均繼承Coprocessor接口:

  1. RegionObserver 針對於Region的觀察者(Region打開、關閉、刷新、合併等工做)
  2. RegionServerObserver 針對RegionServer的觀察者(Region合併、分裂、日誌回滾等)
  3. MasterObserver 針對Master的觀察者(表建立、刪除、Region移動、拆分等工做)
  4. WALObserver 針對WAL的觀察者(日誌寫)

EndPoint使用場景與實現

Endpoint容許定義本身的動態RPC協議,用於客戶端與region servers通信。Coprocessor 與region server在相同的進程空間中,所以您能夠在region端定義本身的方法(endpoint),將計算放到region端,減小網絡開銷,經常使用於提高hbase的功能,如:count,sum等。

工做過程以下圖所示過程:
image

  1. 不論是經過配置仍是表描述加載了EndPoint協處理器
  2. 在Client執行CoprocessorExec()調用對應的RPC方法
  3. 在對應的每一個region中都會執行該方法後返回結果
  • EndPoint實現
  • 建立一個「.proto」文件定義服務
  • 執行protoc命令,經過「.proto」文件生成Java代碼
  • 編寫一個Coprocessor類,實現Coprocessor和CoprocessorService兩個接口,並實現接口中定義的方法:
  • 加載Coprocessor
  • 編寫客戶端代碼調用Coprocessor

裝載Coprocessor

裝載Coprocessor分爲靜態裝載和動態裝載。

靜態裝載Coprocessor

  • 靜態裝載過程:
    • hbase-site.xml中建立記錄
    • 將代碼放到HBase的類路徑下。一個簡單的方法是將封裝好的jar(包括代碼和依賴)放到HBase安裝路徑下的/lib目錄中。
    • 重啓HBase。
  • 靜態卸載的步驟以下:
  1. 移除在hbase-site.xml中的配置。
  2. 重啓HBase。
  3. 這一步是可選的,將上傳到HBase類路徑下的jar包移除。

動態裝載Coprocessor

動態裝載Coprocessor的一個優點就是不須要重啓HBase。不過動態裝載的Coprocessor只是針對某個表有效。所以,動態裝載的Coprocessor又被稱爲表級Coprocessor。
此外,動態裝載Coprocessor是對錶的一次schema級別的調整,所以在動態裝載Coprocessor時,目標表須要離線。
動態裝載Coprocessor有兩種方式:經過HBase Shell和經過Java API。

達摩克利斯之劍

Coprocessor是HBase的高級功能,原本是隻爲HBase系統開發人員準備的。由於Coprocessor的代碼直接在RegionServer上運行,並直接接觸數據,這樣就帶來了數據破壞的風險,好比「中間人攻擊(Man-in-the-MiddleAttack,簡稱「MITM攻擊」,見百度詞條)」以及其餘類型的惡意入侵。目前尚未任何機制來屏蔽Coprocessor致使的數據破壞。此外,由於沒有資源隔離,一個即便不是惡意設計的但表現不佳的Coprocessor也會嚴重影響集羣的性能和穩定性。

其餘公司實踐

二級索引設計

Phoenix的Salting功能很是有效,但對延遲影響較大,所以若延遲要求較高,那麼Salting則並不合適,因此這裏在主表與索引表中不使用Salting功能,而是採用reverse將主鍵列散列。索引中使用Function Index和Function Index減小查詢延遲。

參考文獻

相關文章
相關標籤/搜索