全部产品
云市场

管理HBase全文索引

更新时间:2020-04-08 18:37:34

准备工作

学习快速入门部分,并在Shell页面下载好最新版本的Shell,并配置好连接和在HBase的控制台中开启白名单

映射Schema详解

HBase索引映射schema即管理HBase表的列映射到Solr的Collection Field和具体的类型。HBase增强版采用Json方式管理映射Schema。一个典型的映射Schema如下所示:

  1. {
  2. "sourceNamespace": "default",
  3. "sourceTable": "testTable",
  4. "targetIndexName": "democollection",
  5. "indexType": "SOLR",
  6. "rowkeyFormatterType": "STRING",
  7. "fields": [
  8. {
  9. "source": "f:name",
  10. "targetField": "name_s",
  11. "type": "STRING"
  12. },
  13. {
  14. "source": "f:age",
  15. "targetField": "age_l",
  16. "type": "STRING"
  17. }
  18. ]
  19. }

这个schema代表将namespace名为default,表名为testTable的HBase表的数据同步到Solr的democollection这个Collection中。其中f:name这一列(Family名和列名用冒号隔开)映射到Solr中的name_s这一列,f:age这一列映射到Solr中的age_l这一列。下面将解释每个配置项的具体含义和可以配置的参数值。

参数名 含义
sourceNamespace HBase表的namespace名,如果表没有namespace,这个参数可以不配,或者配置为‘default’
sourceTable HBase表的表名,不含namespace的部分
targetIndexName 映射的Solr的collection名
indexType 此项固定为SOLR
rowkeyFormatterType hbase中rowkey的格式,此处可以填STRING或者HEX,具体含义见下方解释
fields 具体映射的列以及类型,fields配置项是一个json array,多个列的配置用逗号隔开,具体参见示例。具体配置详见下方解释。

rowkeyFormatterType

rowkeyFormatterType这个参数是HBase表rowkey映射到Solr Document中id这个unique field(数据类型为string)的方式。目前支持两种方式:

  • STRING:如果用户HBase表的rowkey是String,如row1 order0001,12345(注意12345为字符串,非数字)可以使用此配置。该方式使用Bytes.toString(byte[])函数将rowkey转成Solr Document中的id field。用户在solr中查出对应Document后,可以使用Bytes.toBytes(String)函数将id转成byte[]做为rowkey反查HBase
  • HEX: 如果用户HBase表的rowkey不是String,则使用此方式,比如用户的rowkey是数字12345,或者具有多个含义的字段(有些字段是非String)拼接而成。该方法使用org.apache.commons.codec.binary.Hex包中的encodeAsString(byte[])函数将rowkey转成Solr Document中的id field。用户在solr中查出对应Document后,可以使用Hex.decodeHex(String.toCharArray())函数将idString转成byte[]做为rowkey反查HBase。

注意:如果HBase表的Rowkey并非由String组成(即不是用Bytes.toBytes(String)方法当做rowkey存入HBase),请使用HEX方式,否则在将Solr Document中的id反转成bytes后有可能会和原rowkey不一样从而反查失败。

fields

每一个field映射都由以下三个参数组成:

参数名 含义
source HBase表中需要映射的列名,其中family和qualifier的名字用冒号隔开,如f:name
targetField Solr中对应的列名,Solr中每一列都必须预定义,或者使用动态列,如name_s,Solr的schema配置参见Solr Schema配置
type HBase中存入的这一列的type,注意是HBase中source这一列的类型,非Solr中targetField的类型。可以配置的值为INT/LONG/STRING/BOOLEAN/FLOAT/DOUBLE/SHORT/BIGDECIMAL

理解数据类型type

在HBase中,是没有数据类型这个概念的,所有类型的数据,包括中文字符,都是用户自己调用Bytes.toBytes(String/long/int/...)方法,把对应的String/long/int等类型转化成bytes存储在HBase的列中。配置type字段,就是要告诉系统,你存入到HBase的这一列,是使用哪种方法存入HBase的该列中的。比如

  1. int age = 25;
  2. byte[] ageValue = Bytes.toBytes(age);
  3. put.addColumn(Bytes.toBytes("f"), Bytes.toBytes("age"), ageValue);
  4. String name = "25";
  5. byte[] nameValue = Bytes.toBytes(name);
  6. put.addColumn(Bytes.toBytes("f"), Bytes.toBytes("name"), nameValue);

上述代码中f:age这一列的type为INT的值,而“f:name”这一列的type为STRING的列,而非是一个INT。填对type类型对正确地将数据同步到Solr至关重要。因为系统会根据用户填入的type类型来从bytes数组中反解出原始数值来同步到solr里。在上述的列子中,如果用户错误地把f:name这一列的type填写为’INT’,系统会调用Bytes.toInt()方法反解原始值,很显然反解出来的值一定是错误的。

理解targetField

targetField表示HBase中source这一列将会在Solr中映射的列。Solr是一个强Schema的系统,每一列都必须在Solr的managed_schema中预先定义(Solr的schema配置参见Solr Schema配置 )。但是这里我们推荐使用Solr的dynamicField功能,通过后缀自动识别这一列的类型,这样不用修改Solr的Schema就可以往Solr中写入新的列。比如name_s代表这一列在Solr中的类型为String。
HBase中source的类型type并不需要和Solr field的数据类型一一对应。比如用户可以定义Source列f:age的type为String,而solr的targetField为age_l(代表solr中这一列的类型为long),在写入时,Solr会自动把String转化成long。但是如果用户往f:age列中写入了一个无法转换成数字的String,那么写入Solr时,一定会报错。

管理Schema

修改映射Schema

用户可以将上一节介绍的json格式的schema存储在一个文件中,如schema.json,然后在HBase Shell中直接调用alter_external_index命令完成对HBase映射Schema的修改。schema.json文件需要放在启动HBase Shell的目录,或者使用绝对或者相对路径指向该文件。

  1. hbase(main):006:0> alter_external_index 'HBase表名', 'schema.json'

使用json管理可以快速地添加,删除,修改多列。同时,也可以将fields中的映射列全部删掉,从而达到删除HBase表所有映射的目的。比如:

  1. {
  2. "sourceNamespace": "default",
  3. "sourceTable": "testTable",
  4. "targetIndexName": "democollection",
  5. "indexType": "SOLR",
  6. "rowkeyFormatterType": "STRING",
  7. "fields": []
  8. }

如果用户只想在原有的映射Schema上添加一列或者几列,可以采用add_external_index_field命令去添加一列或者多列。

  1. 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完成

  1. 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描述

  1. hbase(main):005:0> describe_external_index 'testTable'