Hbase協處理器

2021-08-09 03:26:00 字數 3394 閱讀 5454

hbase作為資料庫最經常被人詬病的特性包括:

無法輕易建立「二級索引」,難以求和、計數、排序等操作

比如,在舊版本的(<0.92)hbase中,統計資料表的行數,需要使用counter方法,執行一次mapreduce job 才能得到。雖然hbase在資料儲存層中整合了mapreduce,能夠有效用於資料表的分布式計算

然而在很多情況下,做一些簡單的相加或者聚合計算的時候,如果直接將計算過程放置在server端,能夠減少通訊開銷,從而獲得很好的效能提公升。於是,hbase在0.92之後引入了協處理器,實現一些激動人心的新特性:能夠輕易建立二級索引、複雜過濾器以及訪問控制等

hbase協處理器的靈感來自於jeff dean 09年的演講。它根據該演講實現了類似bigtable的協處理器,包括一下特性:

1) 每個表伺服器的任意子表都可以執行**

2) 客戶端的高層呼叫介面(客戶端能夠直接訪問資料表的行位址,多行讀寫會自動分片成多個rpc呼叫)

3) 提供乙個非常靈活、可用於建立分布式服務的資料模型

4) 能夠自動化拓展、負載均衡、應用請求路由

hbase的協處理器靈感來自bigtable。但是實現細節不盡相同。hbase建立了乙個框架,它為使用者提供類庫和執行時環境,使得他們的**能夠在hbase region server 和 master 上處理

協處理器分為兩種型別,系統協處理器可以全域性匯入regionserver上的所有資料表,表寫吹即是使用者可以指定一張表使用協處理器

協處理器框架為了更好支援其行為的靈活性,提供了兩個不同方面的外掛程式。乙個是觀察者(observer),類似於關聯式資料庫的觸發器。另乙個是終端(endpoint),動態的終端有點像儲存過程

observer

觀察者的設計意圖是允許使用者通過插入**來過載處理器框架的upcall方法,而具體的時間出發的callback方法有hbase 的核心**來執行。協處理器框架處理所有的callbback

呼叫細節,協處理器資深只需要插入新增或者改變的功能

以hbase0.92為例,它提供了三種觀察者介面:

regionobserver:提供客戶端的資料操縱時間鉤子:get、put、delete、scan等。

walobserver:提供wal相關操作的鉤子

masterobserver:提供ddl型別的操作鉤子。如建立、刪除、修改資料表等。

這些介面可以同時使用在同乙個地方,按照不同優先順序順序執行,使用者可以任意基於協處理器實現複雜的hbase功能層。hbase有很多時間可以觸發觀察者方法,這些時間與方法從hbase0.92版本起,都會整合在hbase api中。不過這些api可能會由於各種原因有所改動,不同版本的介面改動比較大

observer模型

endponit

終端是動態rpc外掛程式的介面,它的實現**被安裝在伺服器端,從而能夠通過hbase rpc喚醒。客戶端類庫提供了非常方便的方法來呼叫這些動態介面,他們可以在任意時候呼叫乙個終端,他們的實現**會被目標region遠端執行,結果會返回到終端。使用者可以結合使用這些強大的外掛程式介面,為hbase新增全新的特性。終端的使用,如下面的流程所示:

定義乙個新的protocol介面,必須繼承coprocessorprotocol

實現終端介面,該實現會被匯入region環境執行。

繼承抽象類,baseendpointcoprocessor

在客戶端,終端可以被兩個新的hbase client api 呼叫。單個region:

htableinte***ce.coprocessorproxy(classprotocol,byte row).regions區域:htableinte***ce.coprocessorexec(classprotocol,byte startkey,byte endkey,batch.callcallable)

有三個方法對endpoint進行設定:

a.啟動全域性aggregation,能通過操縱所有表上的資料。通過修改hbase-site.xml這個檔案來實現,只需要新增如下**

hbase.coprocessor.user.region.classes

org.apache.hadoop.hbase.coprocessor.rowcountendpoint

b.啟用表aggregation,只對特定的表生效,通過hbase shell來實現.

(1)disable指定表。hbase>disable 'mytable'

(2)新增aggregation hbase > alter 'mytable',method=>'table_att','coprocessor'=>'|org.apache.hadoop.hbase.coprocessor.rowcountendponit||'

(3)重啟指定表hbase>enable 'mytable'

c.api呼叫

htabledescriptor htd = new htabledescriptor("testtable");

htd.setvalue("corprocessor$1",path.tistring+"|"+rowcountendpoint.class.getcanonicalname()+"|"+coprocessor.priority.user);

hbase 協處理器 部署 hbase 協處理器

1 自定義協處理器 hbase 版本 2.x 使用自定義的協處理器需要實現coprocessor,regionobserver,coprocessorservice這三個介面,如下圖 可以看出協處理器的載入分為靜態載入和動態載入,靜態載入需要修改hbase site.xml配置檔案,這將對所有的hb...

HBase協處理器

協處理器分兩種型別,系統協處理器可以全域性匯入region server上的所有資料表,表協處理器即是使用者可以指定一張表使用協處理器。協處理器框架為了更好支援其行為的靈活性,提供了兩個不同方面的外掛程式。乙個是觀察者 observer 類似於關聯式資料庫的觸發器。另乙個是終端 endpoint 動...

Hbase協處理器

observer masterobserver walobserver observer提供了一些設計好的 函式,每個操作在集群伺服器端都可以被呼叫。endpoint observer 與 endpoint總結 協處理器載入方式 動態載入 sh hbase disable table名 sh hba...