hbase1.2 coprocessor使用介紹和問題總結(部署、卸載以及更新)

環境信息:

HBase 1.2.2,Hadoop 2.7.2

使用需求:

由於需要使用es創建hbase的二級索引,所以打算使用coprocessor中的RegionObserver來實現此功能,本文主要也是講解RegionObserver的加載以及使用注意事項

使用總結:

 

RegionObserver的加載分爲動態加載和靜態加載

靜態加載(通過配置HBase):

在 hbase-site.xml 定義一個協處理器

<property>
    <name>hbase.coprocessor.region.classes</name>
    <value>org.myname.hbase.coprocessor.endpoint.SumEndPoint</value>
</property>

如果多個類被指定要加載,類名間要用逗號分隔。框架會試圖使用默認類加載器加載所有配置的類。因此,這個jar文件必須位於server端的HBase classpath中。

通過這種方式加載的Coprocessors將對所有表的所有Region都是激活狀態的。這些也被稱作 系統協處理器System Coprocessor。首先列出的Coprocessors 將被賦予 Coprocessor.Priority.SYSTEM這樣的優先級。列表中每一個後續的 coprocessor 將會把它的優先級加一(這是在減小它的優先級,因爲優先級是按照整數的自然順序排列的,第一個coprocessor被賦值爲coprocessor$1,後續$後面的數據會遞增)。

當調用註冊的觀察者時,框架會按照它們的優先級順序執行它們的回調方法。

靜態卸載:

  1. 在hbase-site.xml中刪除協處理器的 <property> 元素,包括子元素。

  2. 重啓 HBase.

  3. 可選的操作是,從HBase的 lib/ 目錄下或者從classpath中移除這個協處理器的 JAR 文件。

動態加載(使用 HBase Shell 或 Java API):

你可以在不重啓HBase的情況下,動態加載協處理器。這看起來比靜態加載更好,但是動態加載協處理器的是被加載到一張表上,並且只在加載它們的表上可用。由此,動態加載的協處理器有時被稱爲表協處理器Table Coprocessor

另外,動態加載一個協處理器相當於改變表的結構,表必須下線以加載協處理器。

準備工作:

  • 一個JAR coprocessor.jar 包含了這個 Coprocessor 的執行和它所有的依賴(rich package)。

  • 這個JAR 在 HDFS 中可用,如 hdfs://<namenode>:<port>/path/coprocessor.jar

HBase shell:

添加:

  1. 在HBase Shell中禁用表:

    hbase(main):001:0> disable 'ais_ori_2018'

     

  2. 使用如下命令加載這個 Coprocessor:

    hbase(main):002:0> alter 'ais_ori_2018', METHOD => 'table_att', 'coprocessor' => 'hdfs:///coprocessor/coprocessor4es-0.0.2-SNAPSHOT.jar|com.hxy.main.HbaseDataSyncEsObserver|1001|es_cluster=cetcocean-es,es_type=indexer,es_index=hbase_indexer_alias,es_port=9300,es_host=192.168.10.48'

    協處理器框架將試着從協處理器表的屬性值中讀取類的信息。這個值包含由管道符號(|)分割成的4片信息。

    • 文件路徑: 包含 Coprocessor 定義的這個jar文件必須在所有的RegionServer可以讀取到的位置上。
      你可以拷貝這個文件到每一個RegionServer的本地磁盤上,但是推薦把它存放在HDFS上。

    • 類名: Coprocessor的完整類名.

    • 優先級: 一個整數。該框架將確定在同一個鉤子上使用優先級註冊的所有配置的觀察器的執行順序,並使用優先級。這片信息可以留空不填,這樣的話,框架將會賦予一個默認的優先級值。

    • 參數 (可選): 這片信息會傳入協處理器的實現類中。這片信息是可選的。

  3. 啓用這個表.

    hbase(main):003:0> enable 'ais_ori_2018'

     

  4. 驗證協處理器是否被加載:

    hbase(main):04:0> describe 'ais_ori_2018'

    協處理器應該在TABLE_ATTRIBUTES 列出。

卸載:

  1. 禁用表

    hbase(main):001:0> disable 'ais_ori_2018'

     

  2. 修改表以移除coprocessor.

    hbase(main):002:0> alter 'users', METHOD => 'table_att_unset', NAME => 'coprocessor$1'

     

啓用表

hbase(main):003:0> enable 'ais_ori_2018'

Java API:

添加:

過程就是修改表結構,其中增加一個屬性即可

TableName tableName = TableName.valueOf("ais_ori_2018");
String path = "hdfs://<namenode>:<port>/path/coprocessor.jar";
Configuration conf = HBaseConfiguration.create();
Connection connection = ConnectionFactory.createConnection(conf);
Admin admin = connection.getAdmin();
admin.disableTable("ais_ori_2018");
HTableDescriptor hTableDescriptor = new HTableDescriptor("ais_ori_2018");
HColumnDescriptor columnDesc = new HColumnDescriptor(Bytes.toBytes("data"));
columnDesc.setMaxVersions(3);
columnDesc.setBlockCacheEnabled(true);
columnDesc.setBloomFilterType(BloomType.ROW);
columnDesc.setCompressionType(Algorithm.SNAPPY);
hTableDescriptor.addFamily(columnDesc);
hTableDescriptor.setValue("COPROCESSOR$1", path + "|" + RegionObserverExample.class.getCanonicalName() + "|" + Coprocessor.PRIORITY_USER);
admin.modifyTable("ais_ori_2018", hTableDescriptor);
admin.enableTable("ais_ori_2018");

卸載:

將剛纔添加的屬性去掉覆蓋即可

TableName tableName = TableName.valueOf("ais_ori_2018");
String path = "hdfs://<namenode>:<port>/path/coprocessor.jar";
Configuration conf = HBaseConfiguration.create();
Connection connection = ConnectionFactory.createConnection(conf);
Admin admin = connection.getAdmin();
admin.disableTable("ais_ori_2018");
HTableDescriptor hTableDescriptor = new HTableDescriptor("ais_ori_2018");
HColumnDescriptor columnDesc = new HColumnDescriptor(Bytes.toBytes("data"));
columnDesc.setMaxVersions(3);
columnDesc.setBlockCacheEnabled(true);
columnDesc.setBloomFilterType(BloomType.ROW);
columnDesc.setCompressionType(Algorithm.SNAPPY);
hTableDescriptor.addFamily(columnDesc);
admin.modifyTable("ais_ori_2018", hTableDescriptor);
admin.enableTable("ais_ori_2018");

問題總結:

捆綁協處理器 Bundling Coprocessors

你可以將一個coprocessor的所有類捆綁到RegionServer的classpath中的單個JAR中,以便進行簡單的部署。否則,將所有依賴項放在RegionServer的classpath中,以便在RegionServer啓動時加載它們。

更新一個協處理器 Updating a Coprocessor

部署一個給定的coprocessor的新版本並不像禁用它、替換JAR並重新啓用協處理器那樣簡單。這是因爲你不能在JVM中重新加載一個類(通過反射來進行加載coprocessor的主類),除非你刪除了所有的對它當前的引用。既然當前JVM引用了這個已經存在的協處理器,你必須通過重啓RegionServer來重啓這個JVM,以替代這個協處理器。這種行爲是不可能改變的。(劃重點:如果想不重啓hbase而更新Coprocessor,可以修改Coprocessor的包名來實現,這樣jvm就會重新加載這個類達到更新的目的

協處理器日誌 Coprocessor Logging

Coprocessor框架不提供超出標準Java日誌記錄的API。Coprocessor的日誌存放在Regionserver的日誌目錄下,在不同的region上執行了Coprocessor,會將日誌記錄在該region對應的Regionserver的日誌目錄下

協處理器配置 Coprocessor Configuration

針對寫es作爲hbase二級索引的場景建議將es的相關配置放在coprocessor配置的第四個參數上,可以做到動態配置,涉及到coprocessor使用外部靜態配置的場景可以嘗試將配置寫在此處然後在代碼的configuration對象中獲取。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章