準備工作
學習快速開始部分,在使用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,如row1
order0001
,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。
Bytes.toBytes(String)
方法當做rowkey存入HBase),請使用HEX方式,否則在將索引Document中的ID反轉成bytes后有可能會和原rowkey不一樣從而反查失敗。
fields
每一個field映射都由以下三個參數組成:
參數名 | 含義 |
---|---|
source | HBase表中需要映射的列名,其中family和qualifier的名字用冒號隔開,如f:name |
targetField | 索引表中的列名,上述示例中給出的列名都是動態列 ,如name_s 、age_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'