更新时间:2024-09-18 GMT+08:00

创建HBase全局二级索引

场景介绍

  • 在用户的表中预先存在大量数据的情况下,可以在某个列上添加索引。
  • 对于未建立索引的用户表,该工具允许用户同时添加和构建索引。

创建HBase全局二级索引

在HBase客户端执行以下命令即可添加或创建索引,执行命令后,指定的索引将被添加到表中:

hbase org.apache.hadoop.hbase.hindex.global.mapreduce.GlobalTableIndexer -Dtablename.to.index='table' -Dindexspecs.to.add='idx1=>cf1:[c1->string],[c2]#idx2=>cf2:[c1->string],[c2]#idx3=>cf1:[c1];cf2:[c1]' -Dindexspecs.covered.family.to.add='idx2=>cf1' -Dindexspecs.covered.to.add='idx1=>cf1:[c3],[c4]' -Dindexspecs.coveredallcolumn.to.add='idx3=>true' -Dindexspecs.splitkeys.to.set='idx1=>[\x010,\x011,\x012]#idx2=>[\x01a,\x01b,\x01c]#idx3=>[\x01d,\x01e,\x01f]'

相关参数介绍如下:

  • tablename.to.index:表示创建索引的数据表的名称。

    当使用tablename.to.index创建索引时,如果数据表为空表,创建的索引状态为ACTIVE,否则索引状态为INACTIVE。

  • indexspecs.to.addandbuild(可选):表示创建时同时生成索引数据,数据表数据量较大时不建议使用,建议使用索引数据生成工具生成索引数据。

    indexspecs.to.addandbuildtablename.to.index不能同时使用,当使用indexspecs.to.addandbuild时,索引状态为BUILDING,当索引数据完整生成后,索引状态会修改为ACTIVE。

  • indexspecs.to.add:表示索引名与对应数据表的列的映射(索引列定义)。
  • indexspecs.covered.to.add(可选):表示索引中冗余存储的数据表的列(覆盖列定义)。
  • indexspecs.covered.family.to.add(可选):表示索引表冗余存储的数据表的列族(覆盖列族定义)。
  • indexspecs.coveredallcolumn.to.add(可选):表示索引表冗余存储数据表中的所有数据(覆盖所有列)。
  • indexspecs.splitkeys.to.set(可选):表示索引表预分区切分点,建议指定,避免索引表Region成为热点。预分区指定格式为:
    • '#'用于分隔索引。
    • splitkey包含在'[]'中。
    • ','用于分隔splitkey。

      预分区每个splitkey必须由\x01开头。

上述命令中的参数描述如下:
  • idx1、idx2、idx3:表示索引名称。
  • cf1、cf2:表示列族名称。
  • c1、c2、c3、c4:表示列名称。
  • string:表示数据类型。支持STRING、INTEGER、FLOAT、LONG、DOUBLE、SHORT、BYTE和CHAR。
  • '#'用于分隔索引,';' 用于分隔列族,','用于分隔列限定符。
  • 列名及其数据类型应包含在'[]'中。
  • 列名及其数据类型通过'->'分隔。
  • 如果未指定具体列的数据类型,则使用默认数据类型(string)。

删除HBase全局二级索引

在HBase客户端执行以下命令可删除某个索引:

hbase org.apache.hadoop.hbase.hindex.global.mapreduce.GlobalTableIndexer -Dtablename.to.index='table' -Dindexnames.to.drop='idx1#idx2'

相关参数介绍如下:

  • tablename.to.index:表示需删除的索引所在的表名称。
  • indexnames.to.drop:表示需要删除的索引名称,可以同时指定多个,用#号分隔。