準備工作

學習快速開始部分,在使用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這一列。下面將解釋每個配置項的具體含義和可以配置的參數值。

參數名 含義
sourceNamespace HBase表的namespace名,如果表沒有namespace,這個參數可以不配,或者配置為‘default’
sourceTable HBase表的表名,不含namespace的部分
targetIndexName Search索引名
indexType 此項固定為SOLR
rowkeyFormatterType hbase中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映射都由以下三個參數組成:

參數名 含義
source HBase表中需要映射的列名,其中family和qualifier的名字用冒號隔開,如f:name
targetField 索引表中的列名,上述示例中給出的列名都是動態列,如name_sage_i,這樣的用法不需要事先定義,直接使用即可,Search服務會自動識別。更多動態列用法參見schema配置
type HBase中的列在寫入時的數據類型,是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'