準備工作
學習快速開始部分,在使用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'