HBase的協處理器
HBase中的協處理器有兩種:observer和endpoint
Observer coprocessor:類似於RDBMS中的觸發器,它在特定事件(例如Get或Put)發生之前或之後執行你的程式碼。
Endpoint coprocessor:類似於RDBMS中的儲存過程,它允許你在RegionServer本身的資料執行自定義計算,而不是在客戶端。
RegionServerObserver:主要針對region的管理的,比如merge,writeWAL等。
RegionObserver:主要針對client端對region上的資料操作,比如get,put,delete,batchMutate等。
MasterObserver:主要針對對HMaster操作。比如CreateTable,DeleteTable,ModifyTable,AddColumn等。
WALObserver :針對WAL的觀察者(日誌寫)。
協處理器主要是在對應的CoprocessorHost中被呼叫。比如RegionObserver在RegionCoprocessorHost中被呼叫。
CoprocessorEnvironment: 主要是提供了協處理器的環境資訊,提供版本資訊,協處理器的優先資訊,協處理器的對應表,協處理器的序號是按照最初載入時順序指定的,在之後的執行過程中也會按照這個序號進行,一個Coprocessor對應著一個環境CoprocessorEnvironment。
載入協處理器:
Hbase 載入協處理器順序:
- 配置檔案載入(系統級別的):通過hbase-site.xml配置檔案載入。
- shell 載入(表級別的): 通過alter 命令來對錶進行schema修改來載入協處理器
- 通過API程式碼載入:API
協處理器載入方式:
靜態載入:
1.hbase-site.xml中配置屬性:
通過hbase.coprocessor.region.classes 配置 RegionObservers 和 Endpoints.
通過hbase.coprocessor.wal.classes 配置 WALObservers.
通過hbase.coprocessor.master.classes 配置MasterObservers.
value 必須寫類的全名。
例子:
<property> <name>hbase.coprocessor.region.classes</name> <value>org.xxx.hbase.coprocessor.endpoint.xxx</value> </property>
如果載入多個類,需要用逗號分隔,該框架使用預設的類載入器來載入配置的類,所以這些jar包必須在HBase的classpath中。
以這種方式載入的協處理器將在所有表的所有region中活動。這些也被稱為系統協處理器。
列表中的第一個協處理器將會分配一個優先順序Coprocessor.Priority.SYSTEM,之後的遞增加1。當呼叫註冊的觀察者時,框架會按照優先順序執行它們的回撥方法。
2.將jar包放入HBase的lib目錄下
3.重啟HBase
動態載入
- 禁用表;
- 解除安裝協處理器;
- 重新指定協處理器;
- 啟用表,即可。
hbase alter ‘users’, METHOD => ‘table_att’, ‘Coprocessor’=>‘hdfs://xxx:9200/
user/xxx/coprocessor.jar| xxx.xxx.RegionObserverExample|1073741823|
arg1=1,arg2=2’
解釋:
- 檔案路徑:檔案路徑中需要包含Coprocessor的實現,並且對所有的RegionServer都是可達的。這個路徑可以是每個RegionServer的本地磁碟路徑,也可以是HDFS上的一個路徑。如果是用路徑來指定要載入的Coprocessor,這個路徑下的所有jar檔案都會被載入,不過該路徑下的子目錄中的jar不會被載入。
- 類名:Coprocessor的全限定類名。
- 優先順序:一個整數。HBase將會使用優先順序來決定在同一個位置配置的所有Observer Coprocessor的執行順序。這個位置可以留白,這樣HBase將會分配一個預設的優先順序。
@see Coprocessor
/** Highest installation priority */
int PRIORITY_HIGHEST = 0;
/** High (system) installation priority */
int PRIORITY_SYSTEM = Integer.MAX_VALUE / 4;
/** Default installation priority for user coprocessors */
int PRIORITY_USER = Integer.MAX_VALUE / 2;
/** Lowest installation priority */
int PRIORITY_LOWEST = Integer.MAX_VALUE;
- 引數(可選的):這些值會被傳遞給要使用的Coprocessor實現。這個項是可選的。
注意事項
重複載入Coprocessor
如果我們先靜態載入了一個Coprocessor,而後又通過HBase Shell動態載入了一次這個Coprocessor。那麼先載入的Coprocessor並不會被覆蓋,而是會同時存在兩個Coprocessor例項。第二個Coprocessor會有更低的優先順序,換句話說,重複載入的第二個Coprocessor例項實際上沒有發揮作用。 要解除安裝、更新,需要重啟JVM,即RegionServer。
RegionCoprocessorHost的協處理器載入過程:
首先載入系統的協處理器,載入實際上就是把協處理器的環境放入一個set中
如果部署系統表的話就載入使用者協處理器
最後從表描述中載入協處理器