使用索引生成工具
场景介绍
为了快速对用户数据创建索引,HBase提供了可通过MapReduce功能创建索引的TableIndexer工具,该工具可实现添加,构建和删除索引。具体使用场景如下:
- 在用户的表中预先存在大量数据的情况下,可能希望在某个列上添加索引。但是,使用addIndicesWithData()API添加索引会生成与相关用户数据对应的索引数据,这将花费大量时间。另一方面,使用addIndices()创建的索引不会构建与用户数据对应的索引数据。因此,为了为这样的用户数据建立索引数据,用户可以使用TableIndexer工具来完成索引的构建。
- 如果索引数据与用户数据不一致,该工具可用于重新构建索引数据。
如果用户暂时禁用索引并且在此期间,向禁用的索引列执行新的put操作,然后直接将索引从禁用状态启用可能会导致索引数据与用户数据不一致。因此,用户必须注意在再次使用之前重新构建所有索引数据。
- 对于大量现有的索引数据,用户可以使用TableIndexer工具将索引数据从用户表中完全删除。
- 对于未建立索引的用户表,该工具允许用户同时添加和构建索引。
使用方法
- 添加新的索引到用户表
命令如下所示:
hbase org.apache.hadoop.hbase.hindex.mapreduce.TableIndexer -Dtablename.to.index=tablename -Dindexspecs.to.add='idx_0=>cf_0:[q_0->string],[q_1];cf_1:[q_2],[q_3]#idx_1=>cf_1:[q_4]'
它需要以下参数:
- tablename.to.index:表示创建索引的表的名称
- indexspecs.to.add:表示与索引名与对应用户表的列的映射
- scan.caching(可选):包含一个整数值,表示在扫描数据表时将传递给扫描器的缓存行数
上述命令中的参数描述如下:
- idx_1:表示索引名称
- cf_0:表示列族名称
- q_0:表示列名称
- string:表示数据类型。它可以是STRING,INTEGER,FLOAT,LONG,DOUBLE,SHORT,BYTE或CHAR
- '#'用于分隔索引,';' 用于分隔列族,','用于分隔列限定符。
- 列名及其数据类型应包含在'[]'中。
- 列名及其数据类型通过' - >'分隔。
- 如果未指定具体列的数据类型,则使用默认数据类型(string)。
- 如果未设置可选参数scan.caching,则将采用默认值1000。
- 用户表必须存在。
- 表中指定的索引不能存在.。
- 如果用户表中已经存在名称为'd'的ColumnFamily,则用户必须使用TableIndexer工具构建索引数据。
在执行以上的命令之后,指定的索引将被添加到表中并且将处于INACTIVE状态。该行为与addIndices() API类似。
- 为用户表中的现有索引构建索引数据
该命令如下:
hbase org.apache.hadoop.hbase.hindex.mapreduce.TableIndexer -Dtablename.to.index=tablename -Dindexnames.to.build='idx_0#idx_1'
它采用以下参数:
- tablename.to.index:表示创建索引的表的名称
- indexspecs.to.build:表示与索引名称
- scan.caching(可选):包含一个整数值,表示在扫描数据表时将传递给扫描器的缓存行数
上述命令中的参数描述如下:
- idx_1:表示索引名称
- '#'用于分隔索引名称。
- 如果未设置可选参数scan.caching,则将采用默认值1000。
- 用户表必须存在。
在执行以上的命令之后,指定的索引将被设置为ACTIVE状态。用户扫描数据时可以使用它们。
- 从用户表中删除现有索引及其数据
该命令如下:
hbase org.apache.hadoop.hbase.hindex.mapreduce.TableIndexer -Dtablename.to.index=tablename -Dindexnames.to.drop='idx_0#idx_1'
它需要以下参数:
- tablename.to.index:表示创建索引的表的名称
- indexnames.to.drop:表示应该和其数据一起删除的索引的名称(必须存在于表中)
- scan.caching(可选):其中包含一个整数值,指示在扫描数据表时将传递给扫描器的缓存行数
上述命令中的参数描述如下:
- idx_1:表示索引名称
- '#'用于分隔索引名称。
- 如果未设置可选参数scan.caching,则将采用默认值1000。
- 用户表必须存在。
在执行前面的命令之后,指定的索引将从表中删除。
- 为用户表添加新的索引以及基于现有数据的数据构建
该命令如下:
hbase org.apache.hadoop.hbase.hindex.mapreduce.TableIndexer -Dtablename.to.index=tablename -Dindexspecs.to.add='idx_0 => cf_0:[q_0-> string],[q_1];cf_1:[ q_2],[q_3]#idx_1 => cf_1:[q_4]' -Dindexnames.to.build='idx_0'
- 参数与之前的情况相同。
- 用户表必须存在。
- indexspecs.to.add中指定的索引不得存在于表中。
- indexnames.to.build中指定的索引名称必须已经存在于表中,或者应该是indexspecs.to.add的一部分。
在执行前面的命令之后,indexspecs.to.add中指定的所有索引都将添加到该表中,并且将为通过indexnames.to.build为指定的所有索引构建索引数据。