准备工作

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