Hbase总结(八)Hbase中的Coprocessor
1.起因(Why HBase ?Coprocessor)
HBase作為列族數據庫最經常被人詬病的特性包括:無法輕易建立“二級索引”,難以執行求和、計數、排序等操作。比如,在舊版本的(<0.92)Hbase中,統計數據表的總行數,需要使用Counter方法,執行一次MapReduce Job才能得到。雖然HBase在數據存儲層中集成了MapReduce,能夠有效用于數據表的分布式計算。然而在很多情況下,做一些簡單的相加或者聚合計算的時候,如果直接將計算過程放置在server端,能夠減少通訊開銷,從而獲得很好的性能提升。于是,HBase在0.92之后引入了協處理器(coprocessors),實現一些激動人心的新特性:能夠輕易建立二次索引、復雜過濾器(謂詞下推)以及訪問控制等。
2.靈感來源( Source of Inspration)
HBase協處理器的靈感來自于Jeff Dean 09年的演講( P66-67)。它根據該演講實現了類似于bigtable的協處理器,包括以下特性:
- 每個表服務器的任意子表都可以運行代碼
- 客戶端的高層調用接口(客戶端能夠直接訪問數據表的行地址,多行讀寫會自動分片成多個并行的RPC調用)
- 提供一個非常靈活的、可用于建立分布式服務的數據模型
- 能夠自動化擴展、負載均衡、應用請求路由
3.細節剖析(Implementation)
協處理器分兩種類型,系統協處理器可以全局導入region server上的所有數據表,表協處理器即是用戶可以指定一張表使用協處理器。協處理器框架為了更好支持其行為的靈活性,提供了兩個不同方面的插件。一個是觀察者(observer),類似于關系數據庫的觸發器。另一個是終端(endpoint),動態的終端有點像存儲過程。
?3.1觀察者(Observer)
觀察者的設計意圖是允許用戶通過插入代碼來重載協處理器框架的upcall方法,而具體的事件觸發的callback方法由HBase的核心代碼來執行。協處理器框架處理所有的callback調用細節,協處理器自身只需要插入添加或者改變的功能。
以HBase0.92版本為例,它提供了三種觀察者接口:
- RegionObserver:提供客戶端的數據操縱事件鉤子:Get、Put、Delete、Scan等。
- WALObserver:提供WAL相關操作鉤子。
- MasterObserver:提供DDL-類型的操作鉤子。如創建、刪除、修改數據表等。
這些接口可以同時使用在同一個地方,按照不同優先級順序執行.用戶可以任意基于協處理器實現復雜的HBase功能層。HBase有很多種事件可以觸發觀察者方法,這些事件與方法從HBase0.92版本起,都會集成在HBase API中。不過這些API可能會由于各種原因有所改動,不同版本的接口改動比較大,具體參考Java Doc。
RegionObserver工作原理,如圖1所示。更多關于Observer細節請參見HBaseBook的第9.6.3章節。
圖1?RegionObserver工作原理
?
3.2終端(Endpoint)
終端是動態RPC插件的接口,它的實現代碼被安裝在服務器端,從而能夠通過HBase RPC喚醒。客戶端類庫提供了非常方便的方法來調用這些動態接口,它們可以在任意時候調用一個終端,它們的實現代碼會被目標region遠程執行,結果會返回到終端。用戶可以結合使用這些強大的插件接口,為HBase添加全新的特性。終端的使用,如下面流程所示:
整體的終端調用過程范例,如圖2所示:
圖2?終端調用過程范例
4.編程實踐(Code Example)
在該實例中,我們通過計算HBase表中行數的一個實例,來真實感受協處理器 的方便和強大。在舊版的HBase我們需要編寫MapReduce代碼來匯總數據表中的行數,在0.92以上的版本HBase中,只需要編寫客戶端的代碼即可實現,非常適合用在WebService的封裝上。
4.1啟用協處理器 Aggregation(Enable Coprocessor Aggregation)
我們有兩個方法:1.啟動全局aggregation,能過操縱所有的表上的數據。通過修改hbase-site.xml這個文件來實現,只需要添加如下代碼:
<property><name>hbase.coprocessor.user.region.classes</name><value>org.apache.hadoop.hbase.coprocessor.AggregateImplementation</value></property>2.啟用表aggregation,只對特定的表生效。通過HBase Shell 來實現。
(1)disable指定表。hbase> disable 'mytable'
(2)添加aggregation?hbase> alter 'mytable', METHOD => 'table_att','coprocessor'=>'|org.apache.hadoop.hbase.coprocessor.AggregateImplementation||'
(3)重啟指定表?hbase> enable 'mytable'
4.2統計行數代碼(Code Snippet)
public class MyAggregationClient { private static final byte[] TABLE_NAME = Bytes.toBytes("mytable"); private static final byte[] CF = Bytes.toBytes("vent"); public static void main(String[] args) throws Throwable { Configuration customConf = new Configuration(); customConf.setStrings("hbase.zookeeper.quorum", "node0,node1,node2"); //提高RPC通信時長 customConf.setLong("hbase.rpc.timeout", 600000); //設置Scan緩存 customConf.setLong("hbase.client.scanner.caching", 1000); Configuration configuration = HBaseConfiguration.create(customConf); AggregationClient aggregationClient = new AggregationClient( configuration); Scan scan = new Scan(); //指定掃描列族,唯一值 scan.addFamily(CF); long rowCount = aggregationClient.rowCount(TABLE_NAME, null, scan); System.out.println("row count is " + rowCount);} }4.3 典型例子
? 協處理器其中的一個作用是使用Observer創建二級索引。先舉個實際例子:?
? 我們要查詢指定店鋪指定客戶購買的訂單,首先有一張訂單詳情表,它以被處理后的訂單id作為rowkey;其次有一張以客戶nick為rowkey的索引表,結構如下:?
rowkey family?
dp_id+buy_nick1 tid1:null tid2:null ...?
dp_id+buy_nick2 tid3:null?
...?
該表可以通過Coprocessor來構建,實例代碼:?
即繼承BaseRegionObserver類,實現prePut方法,在插入訂單詳情表之前,向索引表插入索引數據。?
4.4索引表的使用?
先在索引表get索引表,獲取tids,然后根據tids查詢訂單詳情表。?當有多個查詢條件(多張索引表),根據邏輯運算符(and 、or)確定tids。?
4.5使用時注意?
1.索引表是一張普通的hbase表,為安全考慮需要開啟Hlog記錄日志。?
2.索引表的rowkey最好是不可變量,避免索引表中產生大量的臟數據。?
3.如上例子,column是橫向擴展的(寬表),rowkey設計除了要考慮region均衡,也要考慮column數量,即表不要太寬。建議不超過3位數。?
4.如上代碼,一個put操作其實是先后向兩張表put數據,為保證一致性,需要考慮異常處理,建議異常時重試。?
4.6效率情況?
put操作效率不高,如上代碼,每插入一條數據需要創建一個新的索引表連接(可以使用htablepool優化),向索引表插入數據。即耗時是雙倍的,對hbase的集群的壓力也是雙倍的。當索引表有多個時,壓力會更大。?
查詢效率比filter高,毫秒級別,因為都是rowkey的查詢。?
如上是估計的效率情況,需要根據實際業務場景和集群情況而定,最好做預先測試。?
4.7Coprocessor二級索引方案優劣?
優點:在put壓力不大、索引region均衡的情況下,查詢很快。?
缺點:業務性比較強,若有多個字段的查詢,需要建立多張索引表,需要保證多張表的數據一致性,且在hbase的存儲和內存上都會有更高的要求。 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的Hbase总结(八)Hbase中的Coprocessor的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HBase总结(七)LSM理解
- 下一篇: HBase phoenix二级索引