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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Hbase 学习(三)Coprocessors

發布時間:2025/5/22 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hbase 学习(三)Coprocessors 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Coprocessors

之前我們的filter都是在客戶端定義,然后傳到服務端去執行的,這個Coprocessors是在服務端定義,在客戶端調用,然后在服務端執行,他有點兒想我們熟悉的存儲過程,傳一些參數進去,然后進行我們事先定義好的操作,我們常常用它來做一些比如二次索引啊,統計函數什么的,它也和自定義filter一樣,需要事先定好,然后在hbase-env.sh中的HBASE_CLASSPATH中指明,就像我的上一篇中的寫的那樣。 Coprocessors分兩種,observer和endpoint。 (1)observer就像觸發器一樣,當某個事件發生的時候,它就出發。 已經有一些內置的接口讓我們去實現,RegionObserver、MasterObserver、WALObserver,看名字就大概知道他們是干嘛的。 (2)endpoint可以認為是自定義函數,可以把這個理解為關系數據庫的存儲過程。 所有的Coprocessor都是實現自Coprocessor 接口,它分SYSTEM和USER,前者的優先級比后者的優先級高,先執行。 它有兩個方法,start和stop方法,兩個方法都有一個相同的上下文對象CoprocessorEnvironment。 void start(CoprocessorEnvironment env) throws IOException;? void stop(CoprocessorEnvironment env) throws IOException; 這是CoprocessorEnvironment的方法。
Working with Tables 對表進行操作的時候,必須先調用getTable方法活得HTable,不可以自己定義一個HTable,目前貌似沒有禁止,但是將來會禁止。 并且在對表操作的時候,不能對行加鎖。 Coprocessor Loading Coprocessor加載需要在配置文件里面全局加載,比如在hbase-site.xml中設置。 <property><name>hbase.coprocessor.region.classes</name><value>coprocessor.RegionObserverExample,coprocessor.AnotherCoprocessor</value> </property> <property><name>hbase.coprocessor.master.classes</name><value>coprocessor.MasterObserverExample</value> </property> <property><name>hbase.coprocessor.wal.classes</name><value>coprocessor.WALObserverExample,bar.foo.MyWALObserver</value> </property> 我們自定義的時間可以注冊到三個配置項上,分別是hbase.coprocessor.region.classes,hbase.coprocessor.master.classes, hbase.coprocessor.wal.classes上,他們分別負責region,master,wal,注冊到region的要特別注意小心,因為它是針對所有表的。 <property><name>hbase.coprocessor.region.classes</name><value>coprocessor.RegionObserverExample</value> </property> 注冊到這三個觸發器上,可以監控到幾乎所有我們的操作上面,非常恐怖。。可以說是想要什么就有什么,詳細的代碼大家自己去摸索。 EndPoint的可以用來定義聚合函數,我們可以調用CoprocessorProtocol中的方法來實現我們的需求。 調用coprocessorProxy() 傳一個單獨的row key,這是在單獨一個region上操作的。 要在所有region上面操作,我們要調用coprocessorExec()方法 傳一個開始row key 和結束row key。 Demo 說了那么多廢話,我都不好意思再說了,來個例子吧,統計行數的。 public interface RowCountProtocol extends CoprocessorProtocol {long getRowCount() throws IOException;long getRowCount(Filter filter) throws IOException;long getKeyValueCount() throws IOException; }
public class RowCountEndpoint extends BaseEndpointCoprocessor implementsRowCountProtocol {private long getCount(Filter filter, boolean countKeyValues)throws IOException {Scan scan = new Scan();scan.setMaxVersions(1);if (filter != null) {scan.setFilter(filter);}RegionCoprocessorEnvironment environment = (RegionCoprocessorEnvironment) getEnvironment();// use an internal scanner to perform scanning.InternalScanner scanner = environment.getRegion().getScanner(scan);int result = 0;try {List<KeyValue> curVals = new ArrayList<KeyValue>();boolean done = false;do {curVals.clear();done = scanner.next(curVals);result += countKeyValues ? curVals.size() : 1;} while (done);} finally {scanner.close();}return result;}@Overridepublic long getRowCount() throws IOException {return getRowCount(new FirstKeyOnlyFilter());}@Overridepublic long getRowCount(Filter filter) throws IOException {return getCount(filter, false);}@Overridepublic long getKeyValueCount() throws IOException {return getCount(null, true);} }寫完之后,注冊一下吧。 <property><name>hbase.coprocessor.region.classes</name><value>coprocessor.RowCountEndpoint</value> </property>

JAVA 客戶端調用

在服務端定義之后,我們怎么在客戶端用java代碼調用呢,看下面的例子你就明白啦! public class EndPointExample {public static void main(String[] args) throws IOException {Configuration conf = HBaseConfiguration.create();HTable table = new HTable(conf, "testtable");try {Map<byte[], Long> results = table.coprocessorExec(RowCountProtocol.class, null, null,new Batch.Call<RowCountProtocol, Long>() {@Overridepublic Long call(RowCountProtocol counter)throws IOException {return counter.getRowCount();}});long total = 0;for (Map.Entry<byte[], Long> entry : results.entrySet()) {total += entry.getValue().longValue();System.out.println("Region: " + Bytes.toString(entry.getKey())+ ", Count: " + entry.getValue());}System.out.println("Total Count: " + total);} catch (Throwable throwable) {throwable.printStackTrace();}}} 通過table的coprocessorExec方法調用,然后調用RowCountProtocol接口的getRowCount()方法。 然后遍歷每個Region返回的結果,合起來就是最終的結果,打印結果如下。 Region: testtable,,1303417572005.51f9e2251c29ccb2...cbcb0c66858f., Count: 2 Region: testtable,row3,1303417572005.7f3df4dcba3f...dbc99fce5d87., Count: 3 Total Count: 5在上面的例子當中,我們是用Batch.Call()方法來調用接口當中的方法,我們可以用另外一個方法來簡化上述代碼,來看例子。 Batch.Call call =Batch.forMethod(RowCountProtocol.class,"getKeyValueCount"); Map<byte[], Long> results = table.coprocessorExec(RowCountProtocol.class, null, null, call);

采用Batch.Call方法調用同時調用多個方法

Map<byte[], Pair<Long, Long>> results =table.coprocessorExec( RowCountProtocol.class, null, null, new Batch.Call<RowCountProtocol, Pair<Long, Long>>() {public Pair<Long, Long> call(RowCountProtocol counter) throws IOException {return new Pair(counter.getRowCount(),counter.getKeyValueCount());} }); long totalRows = 0; long totalKeyValues = 0; for (Map.Entry<byte[], Pair<Long, Long>> entry :results.entrySet()) {totalRows +=entry.getValue().getFirst().longValue();totalKeyValues +=entry.getValue().getSecond().longValue();System.out.println("Region: " +Bytes.toString(entry.getKey()) +", Count: " + entry.getValue()); } System.out.println("Total Row Count: " + totalRows); System.out.println("Total KeyValue Count: " +totalKeyValues);

調用coprocessorProxy()在單個region上執行

RowCountProtocol protocol = table.coprocessorProxy(RowCountProtocol.class, Bytes.toBytes("row4")); long rowsInRegion = protocol.getRowCount(); System.out.println("Region Row Count: " +rowsInRegion);上面這個例子是查找row4行所在region的數據條數,這個可以幫助我們統計每個region上面的數據分布。

總結

以上是生活随笔為你收集整理的Hbase 学习(三)Coprocessors的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 一区二区三区网 | 日韩精品一区二区三区四区五区 | 麻豆精品国产精华精华液好用吗 | av首页在线| 五月天堂色| 日韩国产激情 | 97狠狠操 | 亚洲av成人精品一区二区三区在线播放 | 无码人妻精品一区二区50 | 久久精品中文 | 人妻少妇被粗大爽9797pw | 女人18毛片毛片毛片毛片区二 | 极品粉嫩小仙女高潮喷水久久 | 久久精品店 | 亚洲天堂成人在线观看 | 欧美亚洲黄色片 | 天天天天天天操 | 校园春色综合 | 欧美啪啪网 | 中文字幕在线播出 | 精品一区视频 | 国产偷自拍视频 | 国产精品激情 | 中文字幕免费在线视频 | 亚洲视频国产 | 成人亚洲一区 | 久久国产中文 | 重口味av | 国产精品视频免费看 | 婷婷网五月天 | 黄色免费网站在线观看 | 制服丝袜国产在线 | 国产免费一区二区三区最新不卡 | 欧美在线视频播放 | 国产精品一线 | 精品视频无码一区二区三区 | 日韩欧美视频在线播放 | 欧美v日韩| 成人里番精品一区二区 | 欧美视频在线观看免费 | 欧美日韩视频无码一区二区三 | 午夜aa| 亚洲区精品 | 欧美国产日韩一区二区 | 丁香啪啪综合成人亚洲 | jzzijzzij亚洲成熟少妇在线播放 狠狠躁日日躁夜夜躁2022麻豆 | 性色av免费观看 | 在线干 | 久久久久久久9 | 巨乳xxx | 午夜67194 | 久久不射视频 | 国产成人精品一区二区三区免费 | 99久久久无码国产精品性波多 | 国产97av | 欧美做爰性生交视频 | 丝袜人妻一区二区 | 日韩欧美日本 | 亚洲精品国产精品国 | 福利二区视频 | 亚洲网址 | 日韩国产精品视频 | 玖玖爱av| 秋霞久久精品 | 播色网| 国产午夜在线观看 | 无遮挡无掩盖网站 | 美国色视频 | 国产精品自产拍 | 性色av网站 | 亚洲一区在线免费观看 | 蜜桃av噜噜一区二区三区麻豆 | 亚一区二区| 欧美一区二区三区四区五区 | 日本美女黄网站 | 高清在线一区二区三区 | 日本黄网免费 | 国产在线观看黄色 | 日本三级视频在线 | 欧美性大战久久久久久久蜜桃 | 91国产丝袜播放在线 | 北条麻妃一区二区三区 | 日本公妇乱偷中文字幕 | 永久免费成人 | 欧美大片黄色 | 人成在线免费视频 | 黄金网站在线观看 | 国产精品污www在线观看 | 少妇高潮一区二区三区 | 小日子的在线观看免费第8集 | 国产欧美精品一区二区 | 亚洲一区二区电影 | 自拍 亚洲 欧美 | a色视频 | 精品aaa| 日本一区二区视频 | 春意影院福利社 | 久久久久久久影院 | 国产精品jizz在线观看美国 |