全部產品
Search
文件中心

ApsaraDB for HBase:管理HBase全文索引

更新時間:Jul 06, 2024

準備工作

學習快速開始部分,在使用HBaseue Shell訪問增強版叢集下載好並配置好最新版本的Shell。

HBase表與Search索引的映射

表和索引的映射採用JSON方式實現,一個典型的映射配置如下:

{
  "sourceNamespace": "default",
  "sourceTable": "testTable",
  "targetIndexName": "democollection",
  "indexType": "SOLR",
  "rowkeyFormatterType": "STRING",
  "fields": [
    {
      "source": "f:name",
      "targetField": "name_s",
      "type": "STRING"
    },
     {
      "source": "f:age",
      "targetField": "age_i",
      "type": "INT"
    }
  ]
}

上述樣本的含義:將HBase表testTable的資料同步到Search索引democollection中。其中f:name這一列(列族名和列名用冒號隔開)映射到索引中的name_s這一列,f:age這一列映射到索引中的age_i這一列。下面將解釋每個配置項的具體含義和可以配置的參數值。

參數名含義
sourceNamespaceHBase表的namespace名,如果表沒有namespace,這個參數可以不配,或者配置為‘default’
sourceTableHBase表的表名,不含namespace的部分
targetIndexNameSearch索引名
indexType此項固定為SOLR
rowkeyFormatterTypehbase中rowkey的格式,此處可以填STRING或者HEX,具體含義見下方解釋
fields具體映射的列以及類型,fields配置項是一個json array,多個列的配置用逗號隔開,具體參見樣本。具體配置詳見下方解釋。

rowkeyFormatterType

rowkeyFormatterType代表HBase表rowkey映射到索引Document中id(資料類型為string)的方式。目前支援兩種方式:

  • STRING:如果使用者HBase表的rowkey是String,如row1order0001,12345(注意12345為字串,非數字)可以使用此配置。該方式使用Bytes.toString(byte[]),函數將rowkey轉成索引Document中的id。使用者在Search索引中查出對應Document後,可以使用Bytes.toBytes(String),函數將id轉成byte[]做為rowkey反查HBase。
  • HEX: 如果使用者HBase表的rowkey不是String,則使用此方式,比如使用者的rowkey是數字12345,或者具有多個含義的欄位(有些欄位是非String)拼接而成。該方法使用org.apache.commons.codec.binary.Hex包中的encodeAsString(byte[]))函數將rowkey轉成索引Document中的id。使用者在Search索引中查出對應Document後,可以使用Hex.decodeHex(String.toCharArray())函數將idString轉成byte[]做為rowkey反查HBase。
說明 如果HBase表的Rowkey並非由String組成(即不是用Bytes.toBytes(String)方法當做rowkey存入HBase),請使用HEX方式,否則在將索引Document中的ID反轉成bytes後有可能會和原rowkey不一樣從而反查失敗。

fields

每一個field映射都由以下三個參數組成:

參數名含義
sourceHBase表中需要映射的列名,其中family和qualifier的名字用冒號隔開,如f:name
targetField索引表中的列名,上述樣本中給出的列名都是動態列,如name_sage_i,這樣的用法不需要事先定義,直接使用即可,Search服務會自動識別。更多動態列用法參見schema配置
typeHBase中的列在寫入時的資料類型,是HBase中source這一列的類型。可以配置的值為INT/LONG/STRING/BOOLEAN/FLOAT/DOUBLE/SHORT/BIGDECIMAL,大小寫敏感。

理解資料類型type

在HBase中,是沒有資料類型這個概念的,所有類型的資料,包括中文字元,都是使用者自己調用Bytes.toBytes(String/long/int/...)方法,把對應的String/long/int等類型轉化成bytes儲存在HBase的列中。配置type欄位,就是要告訴系統,你存入到HBase的這一列,是使用哪種方法存入HBase的該列中的。比如

int age = 25;
byte[] ageValue = Bytes.toBytes(age);
put.addColumn(Bytes.toBytes("f"), Bytes.toBytes("age"), ageValue);
String name = "25";
byte[] nameValue = Bytes.toBytes(name);
put.addColumn(Bytes.toBytes("f"), Bytes.toBytes("name"), nameValue);

上述代碼中f:age這一列的type為INT的值,而“f:name”這一列的type為STRING的列,而非是一個INT。填對type類型對正確地將資料同步到Search索引至關重要。因為系統會根據使用者填入的type類型來從bytes數組中反解出原始數值來同步到Search索引裡。在上述的列子中,如果使用者錯誤地把f:name這一列的type填寫為’INT’,系統會調用Bytes.toInt()方法反解原始值,很顯然反解出來的值一定是錯誤的。

理解targetField

targetField表示HBase中source這一列將會在Search索引中映射的列。Search服務是一個強Schema的系統,每一列都必須在配置集的managed_schema中預先定義(schema配置參見schema配置 )。但是這裡我們推薦使用Search的動態列(dynamicField)功能,通過尾碼自動識別這一列的類型。比如name_s代表這一列在Search索引中的類型為String。

HBase中source的類型type並不需要和索引中的列資料類型一一對應。比如使用者可以定義Source列f:age的type為STRING,而索引中的targetField為age_i(代表索引中這一列的類型為INT),在寫入索引時,Search服務會自動將STRING轉化成INT。但是如果使用者往f:age列中寫入了一個無法轉換成數位STRING,那麼寫入索引時,一定會報錯。

管理Schema

修改映射Schema

使用者可以將上一節介紹的JSON格式的schema儲存在一個檔案中,如schema.json,然後在HBase Shell中直接調用alter_external_index命令完成對HBase映射Schema的修改。schema.json檔案需要放在啟動HBase Shell的目錄,或者使用絕對或者相對路徑指向該檔案。

hbase(main):006:0> alter_external_index 'HBase表名', 'schema.json'

使用JSON管理可以快速地添加、刪除、修改多列。同時,也可以將fields中的映射列全部刪掉,從而達到刪除HBase表所有映射的目的。比如:

{
  "sourceNamespace": "default",
  "sourceTable": "testTable",
  "targetIndexName": "democollection",
  "indexType": "SOLR",
  "rowkeyFormatterType": "STRING",
  "fields": []
}

如果使用者只想在原有的映射Schema上添加一列或者幾列,可以採用add_external_index_field命令去添加一列或者多列。

 hbase shell> add_external_index_field 'testTable', {FAMILY => 'f', QUALIFIER => 'money', TARGETFIELD => 'money_f', TYPE => 'FLOAT' }

注意:只有使用了alter_external_index添加過映射schema的表,才能使用add_external_index_field的方式單獨添加列。每次修改映射Schema,HBase的表都需要經歷一次完整的alter Table流程,如果需要修改的列比較多,推薦採用alter_external_index的方式一次完成

如果使用者只想在原有的映射schema上刪除一列或者幾列,可以採用remove_external_index完成。

  hbase shell> remove_external_index 'testTable', 'f:name', f:age'

注意:每次修改映射Schema,HBase的表都需要經歷一次完整的alter Table流程,如果需要修改的列比較多,推薦採用alter_external_index的方式一次完成。

查看目前的映射schema

在HBase Shell中使用describe_external_index命令,就可以得到當前表的映射Schema的完整JSON描述。

hbase(main):005:0> describe_external_index 'testTable'