准备工作
学习快速开始部分,在使用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'