天天看點

Hbase 學習(三)Coprocessors

之前我們的filter都是在用戶端定義,然後傳到服務端去執行的,這個coprocessors是在服務端定義,在用戶端調用,然後在服務端執行,他有點兒想我們熟悉的存儲過程,傳一些參數進去,然後進行我們事先定義好的操作,我們常常用它來做一些比如二次索引啊,統計函數什麼的,它也和自定義filter一樣,需要事先定好,然後在hbase-env.sh中的hbase_classpath中指明,就像我的上一篇中的寫的那樣。

<b>coprocessors分兩種,observer和endpoint。</b>

(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的方法。

Hbase 學習(三)Coprocessors

<b>working with tables</b>

對表進行操作的時候,必須先調用gettable方法活得htable,不可以自己定義一個htable,目前貌似沒有禁止,但是将來會禁止。

并且在對表操作的時候,不能對行加鎖。

<b>coprocessor loading</b>

coprocessor加載需要在配置檔案裡面全局加載,比如在hbase-site.xml中設定。

我們自定義的時間可以注冊到三個配置項上,分别是hbase.coprocessor.region.classes,hbase.coprocessor.master.classes,

hbase.coprocessor.wal.classes上,他們分别負責region,master,wal,注冊到region的要特别注意小心,因為它是針對所有表的。

注冊到這三個觸發器上,可以監控到幾乎所有我們的操作上面,非常恐怖。。可以說是想要什麼就有什麼,詳細的代碼大家自己去摸索。

endpoint的可以用來定義聚合函數,我們可以調用coprocessorprotocol中的方法來實作我們的需求。

調用coprocessorproxy() 傳一個單獨的row key,這是在單獨一個region上操作的。

要在所有region上面操作,我們要調用coprocessorexec()方法 傳一個開始row key 和結束row key。

<b>demo</b>

說了那麼多廢話,我都不好意思再說了,來個例子吧,統計行數的。

寫完之後,注冊一下吧。

在服務端定義之後,我們怎麼在用戶端用java代碼調用呢,看下面的例子你就明白啦!

通過table的coprocessorexec方法調用,然後調用rowcountprotocol接口的getrowcount()方法。

然後周遊每個region傳回的結果,合起來就是最終的結果,列印結果如下。

在上面的例子當中,我們是用batch.call()方法來調用接口當中的方法,我們可以用另外一個方法來簡化上述代碼,來看例子。

上面這個例子是查找row4行所在region的資料條數,這個可以幫助我們統計每個region上面的資料分布。