准备工作

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