1. 程式人生 > >HBase的協處理器

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 載入協處理器順序:

  1. 配置檔案載入(系統級別的):通過hbase-site.xml配置檔案載入。
  2. shell 載入(表級別的): 通過alter 命令來對錶進行schema修改來載入協處理器
  3. 通過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

動態載入

  1. 禁用表;
  2. 解除安裝協處理器;
  3. 重新指定協處理器;
  4. 啟用表,即可。

hbase alter ‘users’, METHOD => ‘table_att’, ‘Coprocessor’=>‘hdfs://xxx:9200/
user/xxx/coprocessor.jar| xxx.xxx.RegionObserverExample|1073741823|
arg1=1,arg2=2’
解釋:

  1. 檔案路徑:檔案路徑中需要包含Coprocessor的實現,並且對所有的RegionServer都是可達的。這個路徑可以是每個RegionServer的本地磁碟路徑,也可以是HDFS上的一個路徑。如果是用路徑來指定要載入的Coprocessor,這個路徑下的所有jar檔案都會被載入,不過該路徑下的子目錄中的jar不會被載入。
  2. 類名:Coprocessor的全限定類名。
  3. 優先順序:一個整數。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;
  1. 引數(可選的):這些值會被傳遞給要使用的Coprocessor實現。這個項是可選的。

注意事項

重複載入Coprocessor

如果我們先靜態載入了一個Coprocessor,而後又通過HBase Shell動態載入了一次這個Coprocessor。那麼先載入的Coprocessor並不會被覆蓋,而是會同時存在兩個Coprocessor例項。第二個Coprocessor會有更低的優先順序,換句話說,重複載入的第二個Coprocessor例項實際上沒有發揮作用。 要解除安裝、更新,需要重啟JVM,即RegionServer。

RegionCoprocessorHost的協處理器載入過程:

首先載入系統的協處理器,載入實際上就是把協處理器的環境放入一個set中
如果部署系統表的話就載入使用者協處理器
最後從表描述中載入協處理器