協處理器,我個人的理解就是相當於資料庫的觸發器一樣,可以在改變(增刪改)資料的前後,做一些緊跟的動作
直接舉例子
1.
//重寫preput方法,監聽到向table1表插入資料時,執行向table2表插入資料的**
public
class myprocessor extends
baseregionobserver
}
這是乙個在put前執行其他方法的例子,案例的作用是監聽到向table1表插入資料時,執行向table2表插入資料的**
2.這是另乙個例子,就是有乙個關係表relative,a有b的好友,同樣b有a的好友,需要a刪除b的好友的同時,b好友中的a也應該刪除
//刪除好友關係表,a刪除b的同時,b要刪除a
@override
public
void predelete(observercontexte, delete delete, waledit edit, durability durability) throws
ioexception
//執行批量刪除
relative.delete(deletes);
//關閉table物件
relative.close();
}
上面的**思路是a刪除b之前,寫了乙個協處理器,刪除前處理事件,a刪除b之前,先刪除b中a的記錄。
但是,上面的**會造成死迴圈。協處理器對每一次刪除都要觸發。a要刪除b,觸發,需要b先刪除a,觸發,又需要a先刪除b,死迴圈,hbase直接卡死。
後來,檢視原始碼,確實應該有乙個方法是delete之後觸發的,postdelete,就報上面的方法名換了一下
//刪除好友關係表,a刪除b的同時,b要刪除a
@override
public
void postdelete(observercontexte, delete delete, waledit edit, durability durability) throws
ioexception
//執行批量刪除
relative.delete(deletes);
//關閉table物件
relative.close();
}
當然,這還是不行,最好在刪除前判斷一下,是否有這條記錄,如下
@overridepublic
void postdelete(observercontexte, delete delete, waledit edit, durability durability) throws
ioexception }}
}//執行批量刪除
relative.delete(deletes);
//關閉table物件
relative.close();
}
這樣就可以了,實現刪除relative中好友關係,a刪除b,b也會自動刪除a的好友記錄。
記住,你得上傳jar包到hadoop掛載到habase中relative表
**打包成jar包 postdelete.jar
上傳到hadoop
hdfs dfs -mkdir -p /processor
hdfs dfs -put processor.jar /processor
在hbase中執行
alter 'relative',method => 'table_att','coprocessor'=>'hdfs://linux121:9000/processor/postdelete.jar|com.test.hbase.processor.postdelete|1001|'
表名 列屬性名,可自定義 hadoop中jar包對應得位置資訊 對應類的路徑名包名+類名 優先順序,多個觸發器,優先順序大的先觸發
hbase 協處理器 部署 hbase 協處理器
1 自定義協處理器 hbase 版本 2.x 使用自定義的協處理器需要實現coprocessor,regionobserver,coprocessorservice這三個介面,如下圖 可以看出協處理器的載入分為靜態載入和動態載入,靜態載入需要修改hbase site.xml配置檔案,這將對所有的hb...
HBase協處理器
協處理器分兩種型別,系統協處理器可以全域性匯入region server上的所有資料表,表協處理器即是使用者可以指定一張表使用協處理器。協處理器框架為了更好支援其行為的靈活性,提供了兩個不同方面的外掛程式。乙個是觀察者 observer 類似於關聯式資料庫的觸發器。另乙個是終端 endpoint 動...
Hbase協處理器
hbase作為資料庫最經常被人詬病的特性包括 無法輕易建立 二級索引 難以求和 計數 排序等操作 比如,在舊版本的 0.92 hbase中,統計資料表的行數,需要使用counter方法,執行一次mapreduce job 才能得到。雖然hbase在資料儲存層中整合了mapreduce,能夠有效用於資...