日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Hbase总结(八)Hbase中的Coprocessor

發布時間:2024/1/17 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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調用)
  • 提供一個非常靈活的、可用于建立分布式服務的數據模型
  • 能夠自動化擴展、負載均衡、應用請求路由
HBase的協處理器靈感來自bigtable,但是實現細節不盡相同。HBase建立了一個框架,它為用戶提供類庫和運行時環境,使得他們的代碼能夠在HBase region server和master上處理。

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添加全新的特性。終端的使用,如下面流程所示:

  • 定義一個新的protocol接口,必須繼承CoprocessorProtocol.
  • 實現終端接口,該實現會被導入region環境執行。
  • 繼承抽象類BaseEndpointCoprocessor.
  • 在客戶端,終端可以被兩個新的HBase Client API調用 。單個region:HTableInterface.coprocessorProxy(Class<T> protocol, byte[] row) 。rigons區域:HTableInterface.coprocessorExec(Class<T> protocol, byte[] startKey, byte[] endKey, Batch.Call<T,R> callable)
  • 整體的終端調用過程范例,如圖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來構建,實例代碼:?

    [html]?view plaincopy
  • public?class?TestCoprocessor?extends?BaseRegionObserver?{???
  • ????@Override???
  • ?????public?void?prePut(final?ObserverContext<RegionCoprocessorEnvironment>?e,???
  • ?????final?Put?put,?final?WALEdit?edit,?final?boolean?writeToWAL)???
  • ?????throws?IOException?{???
  • ?????????Configuration?conf?=?new?Configuration();???
  • ?????????HTable?table?=?new?HTable(conf,?"index_table");???
  • ?????????List<KeyValue>?kv?=?put.get("data".getBytes(),?"name".getBytes());???
  • ?????????Iterator<KeyValue>?kvItor?=?kv.iterator();???
  • ?????????while?(kvItor.hasNext())?{???
  • ?????????????KeyValue?tmp?=?kvItor.next();???
  • ?????????????Put?indexPut?=?new?Put(tmp.getValue());???
  • ?????????????indexPut.add("index".getBytes(),?tmp.getRow(),?Bytes.toBytes(System.currentTimeMillis()));???
  • ?????????????table.put(indexPut);???
  • ?????????}???
  • ?????????table.close();???
  • ?????}???
  • }???

  • 即繼承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的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 五月激情视频 | 怡红院男人天堂 | 91精品国产91久久久久青草 | 黄色片免费网站 | 欧美视频成人 | 亚洲国产一二三区 | 最近2018年手机中文字幕版 | 亚洲片国产一区一级在线观看 | 激情网久久| 久久久久久久久99精品 | 五月天欧美| 黑人高潮一区二区三区在线看 | 我的好妈妈在线观看 | 国产真实伦对白全集 | 高清欧美性猛交 | 99久久久国产精品无码性 | 国产欧美精品在线观看 | 一直草 | 国产一级片黄色 | 天天黄色片| 人妻熟妇又伦精品视频a | 欧美我不卡 | 美女毛片 | 亚洲国产精华液网站w | 欧美一级免费黄色片 | 亚洲自拍偷拍精品 | 精品成人免费一区二区在线播放 | 4hu最新网址 | 一区二区不卡在线 | 国产伦精品一区二区三区视频女 | 亚洲高清在线 | 成人精品福利 | 国产95在线| www.猫咪av| 午夜少妇久久久久久久久 | 国产精品一区二区三 | 国产精品免费久久 | 久久久免费av | 国产欧美日韩三区 | 国产在线观看免费高清 | 成人wwwww免费观看 | 日韩成人精品在线观看 | 一区二区少妇 | 人人插插| 亚洲激情视频网 | 神秘马戏团在线观看免费高清中文 | 亚洲aa视频 | 色偷偷影院| 日韩伦理一区二区 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 在线综合视频 | 久久少妇网| 黑人巨大精品欧美一区二区蜜桃 | 91精品中文字幕 | 91天堂网| 91久久精品一区二区三 | av一级久久 | 婷婷俺来也 | 国产精品久久久久久久久 | 天天干天天干天天干天天 | 欧美91成人网 | 日韩一区二区免费播放 | 人av在线 | 男人看片网站 | 一区二区成人免费视频 | 91蝌蚪91九色白浆 | 国产视频九色蝌蚪 | 成人午夜av | 日韩美女做爰高潮免费 | 亚洲一级视频在线观看 | 初尝黑人巨炮波多野结衣 | 亚洲第一天堂 | 日本激情小视频 | 国产成人手机视频 | 精品人妻一区二区三区免费看 | 免费视频一二三区 | 少妇一级淫片免费视频 | aa丁香综合激情 | 越南毛茸茸的少妇 | 日韩女女同性aa女同 | 久热网 | av5566| 亚洲av无码专区国产乱码不卡 | 亚洲一区二区三区电影在线观看 | 久久久久国产精品夜夜夜夜夜 | 正在播放91 | 日韩欧美一级片 | 九一国产视频 | 天天操夜夜添 | 中文字幕精品无码一区二区 | 日韩高清免费观看 | 日韩精品人妻一区二区中文字幕 | 日韩三级欧美 | 久久久天堂国产精品女人 | 日韩中文字幕亚洲精品欧美 | 欧美一二在线 | 恶虐女帝安卓汉化版最新版本 | 91小宝寻花一区二区三区 | 亚洲三区在线观看无套内射 |