Apache HBase加載協(xié)處理器

2018-09-14 14:39 更新

加載協(xié)處理器

要使您的協(xié)處理器可用于HBase,必須靜態(tài)(通過HBase配置)或動態(tài)(使用HBase Shell或Java API)加載它。

靜態(tài)加載

請按照以下步驟靜態(tài)加載協(xié)處理器。請記住,必須重新啟動HBase才能卸載已靜態(tài)加載的協(xié)處理器。

  1. 在hbase-site.xml中定義協(xié)處理器,其中<property>元素帶有<name>和<value>子元素。<name>應(yīng)該是以下之一:
    • 對于RegionObservers和Endpoints是hbase.coprocessor.region.classes。
    • 對于WALObservers是hbase.coprocessor.wal.classes。
    • 對于MasterObservers是hbase.coprocessor.master.classes。
      <value>必須包含協(xié)處理器實現(xiàn)類的完全限定類名。
      例如,要加載協(xié)處理器(在類SumEndPoint.java中實現(xiàn)),您必須在RegionServer的'hbase-site.xml'文件中創(chuàng)建以下條目(通常位于'conf'目錄下):
      <property>
          <name>hbase.coprocessor.region.classes</name>
          <value>org.myname.hbase.coprocessor.endpoint.SumEndPoint</value> 
      </property>       
      如果為加載指定了多個類,則類名必須以逗號分隔??蚣車L試使用默認的類加載器加載所有已配置的類。因此,jar文件必須駐留在服務(wù)器端HBase類路徑中。
      以這種方式加載的協(xié)處理器將在所有表的所有區(qū)域上處于活動狀態(tài)。這些也稱為系統(tǒng)協(xié)處理器。將為第一個列出的協(xié)處理器分配優(yōu)先級Coprocessor.Priority.SYSTEM。列表中的每個后續(xù)協(xié)處理器的優(yōu)先級值都會增加1(這會降低其優(yōu)先級,因為優(yōu)先級具有整數(shù)的自然排序順序)。
      當(dāng)調(diào)用注冊的觀察者時,框架以其優(yōu)先級的排序順序執(zhí)行其回調(diào)方法。關(guān)系是任意破壞的。
  2. 將您的代碼放在HBase的類路徑上。一種簡單的方法是將jar(包含代碼和所有依賴項)放入HBase的安裝目錄lib/中。
  3. 重啟HBase。

靜態(tài)卸載

  1. 從hbase-site.xml中刪除協(xié)處理器的<property>元素,包括子元素。
  2. 重啟HBase。
  3. (可選)從類路徑或HBase的lib/目錄中刪除協(xié)處理器的JAR文件。

動態(tài)加載

您也可以動態(tài)加載協(xié)處理器,而無需重新啟動HBase。這似乎比靜態(tài)加載更好,但動態(tài)加載的協(xié)處理器是基于每個表加載的,并且只能用于加載它們的表。因此,動態(tài)加載的表有時稱為表協(xié)處理器(Table Coprocessor)。

此外,動態(tài)加載協(xié)處理器充當(dāng)表上的模式更改,并且必須使表脫機以加載協(xié)處理器。

有三種方法可以動態(tài)加載協(xié)處理器。

以下說明做了如下假設(shè):

  • 一個叫做coprocessor.jar的JAR包含了協(xié)處理器實現(xiàn)以及它的所有依賴項。
  • 該JAR在HDFS中的某些位置 (如,hdfs://<namenode>:<port>/user/<hadoop-user>/coprocessor.jar ) 中可用。

使用HBase Shell

  1. 使用HBase Shell禁用表:
    hbase> disable 'users'
  2. 使用如下命令加載協(xié)處理器:
    hbase alter 'users', METHOD => 'table_att', 'Coprocessor'=>'hdfs://<namenode>:<port>/
    user/<hadoop-user>/coprocessor.jar| org.myname.hbase.Coprocessor.RegionObserverExample|1073741823| 
    arg1=1,arg2=2'
    
    協(xié)處理器框架將嘗試從協(xié)處理器表屬性值中讀取類信息。該值包含由pipe(|)字符分隔的四條信息。
    • 文件路徑:包含協(xié)處理器實現(xiàn)的jar文件必須位于所有區(qū)域服務(wù)器都可以讀取它的位置。
      您可以將文件復(fù)制到每個區(qū)域服務(wù)器上的本地磁盤上,但建議將其存儲在HDFS中。
      HBASE-14548允許指定包含jar或一些通配符的目錄,例如:hdfs://<namenode>:<port>/user/<hadoop-user>/,或hdfs://<namenode>:<port>/user/<hadoop-user>/*.jar。請注意,如果指定了目錄,則會添加目錄中的所有jar文件(.jar)。它不搜索子目錄中的文件。如果要指定目錄,請不要使用通配符。此增強功能也適用于通過JAVA API的用法。
    • 類名:協(xié)處理器的完整類名。
    • 優(yōu)先級:整數(shù)。該框架將使用優(yōu)先級確定在同一個鉤子上注冊的所有已配置觀察者的執(zhí)行順序。該字段可以保留為空。在這種情況下,框架將分配默認優(yōu)先級值。
    • 參數(shù)(可選):此字段傳遞給協(xié)處理器實現(xiàn)。這是可選的。
  3. 啟用該表。
    hbase(main):003:0> enable 'users'
  4. 驗證協(xié)處理器已加載:
    hbase(main):04:0> describe 'users'
    協(xié)處理器應(yīng)列在TABLE_ATTRIBUTES。

使用Java API(所有HBase版本)

下面的Java代碼演示如何使用HTableDescriptor的setValue()方法在"用戶"表上加載協(xié)處理器。

TableName tableName = TableName.valueOf("users");
String path = "hdfs://<namenode>:<port>/user/<hadoop-user>/coprocessor.jar";
Configuration conf = HBaseConfiguration.create();
Connection connection = ConnectionFactory.createConnection(conf);
Admin admin = connection.getAdmin();
admin.disableTable(tableName);
HTableDescriptor hTableDescriptor = new HTableDescriptor(tableName);
HColumnDescriptor columnFamily1 = new HColumnDescriptor("personalDet");
columnFamily1.setMaxVersions(3);
hTableDescriptor.addFamily(columnFamily1);
HColumnDescriptor columnFamily2 = new HColumnDescriptor("salaryDet");
columnFamily2.setMaxVersions(3);
hTableDescriptor.addFamily(columnFamily2);
hTableDescriptor.setValue("COPROCESSOR$1", path + "|"
+ RegionObserverExample.class.getCanonicalName() + "|"
+ Coprocessor.PRIORITY_USER);
admin.modifyTable(tableName, hTableDescriptor);
admin.enableTable(tableName);

使用Java API(僅限HBase 0.96+)

在HBase 0.96及更新版本中,該HTableDescriptor的addCoprocessor()方法提供了一種動態(tài)加載協(xié)處理器的簡便方法。

TableName tableName = TableName.valueOf("users");
Path path = new Path("hdfs://<namenode>:<port>/user/<hadoop-user>/coprocessor.jar");
Configuration conf = HBaseConfiguration.create();
Connection connection = ConnectionFactory.createConnection(conf);
Admin admin = connection.getAdmin();
admin.disableTable(tableName);
HTableDescriptor hTableDescriptor = new HTableDescriptor(tableName);
HColumnDescriptor columnFamily1 = new HColumnDescriptor("personalDet");
columnFamily1.setMaxVersions(3);
hTableDescriptor.addFamily(columnFamily1);
HColumnDescriptor columnFamily2 = new HColumnDescriptor("salaryDet");
columnFamily2.setMaxVersions(3);
hTableDescriptor.addFamily(columnFamily2);
hTableDescriptor.addCoprocessor(RegionObserverExample.class.getCanonicalName(), path,
Coprocessor.PRIORITY_USER, null);
admin.modifyTable(tableName, hTableDescriptor);
admin.enableTable(tableName);

無法保證框架將成功加載給定的協(xié)處理器。例如,shell命令既不保證特定位置存在jar文件,也不驗證給定類是否實際包含在jar文件中。

動態(tài)卸載

使用HBase Shell

  1. 禁用該表。
    hbase> disable 'users'
  2. 更改表以刪除協(xié)處理器。
    hbase> alter 'users', METHOD => 'table_att_unset', NAME => 'coprocessor$1'
  3. 啟用該表。
    hbase> enable 'users'

使用Java API

重新加載表定義,而無需使用setValue()或addCoprocessor()方法設(shè)置協(xié)處理器的值。這將刪除附加到表的任何協(xié)處理器。

TableName tableName = TableName.valueOf("users");
String path = "hdfs://<namenode>:<port>/user/<hadoop-user>/coprocessor.jar";
Configuration conf = HBaseConfiguration.create();
Connection connection = ConnectionFactory.createConnection(conf);
Admin admin = connection.getAdmin();
admin.disableTable(tableName);
HTableDescriptor hTableDescriptor = new HTableDescriptor(tableName);
HColumnDescriptor columnFamily1 = new HColumnDescriptor("personalDet");
columnFamily1.setMaxVersions(3);
hTableDescriptor.addFamily(columnFamily1);
HColumnDescriptor columnFamily2 = new HColumnDescriptor("salaryDet");
columnFamily2.setMaxVersions(3);
hTableDescriptor.addFamily(columnFamily2);
admin.modifyTable(tableName, hTableDescriptor);
admin.enableTable(tableName);

在HBase 0.96及更新版本中,您可以改為使用該HTableDescriptor類的removeCoprocessor()方法。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號