云服务器内容精选

  • 功能简介 通过调用“org.apache.hadoop.hbase.hindex.global.GlobalIndexAdmin”中的方法进行HBase全局二级索引的管理,该类中addIndices用于创建全局二级索引。 全局二级索引的创建需要指定索引列、覆盖列(可选)、索引表预分区(可选,建议指定)。 在已有存量数据的表上创建全局二级索引,需要创建索引预分区,防止索引表出现热点,索引表数据的rowkey由索引列构成,并且包含分隔符,格式为“\x01索引值\x00”,因此预分区需要指定成对应格式,例如,当使用id列和age列作为索引列时,两个列均为整数,使用id列完成预分区,可以指定索引表预分区点为: \x010,\x011,\x012....
  • 代码样例 以下代码片段在com.huawei.bigdata.hbase.examples包的“GlobalSecondaryIndexSample”类中。 本样例用于查询指定id对应的id、age、name信息,并命中idx_id_age索引,由于查询结果被完全覆盖,且无需回原表查询,能够达到最优的查询性能。 /** * Scan data by secondary index. */ public void testScanDataByIndex() { LOG.info("Entering testScanDataByIndex."); Scan scan = new Scan(); // Create a filter for indexed column. SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("info"), Bytes.toBytes("id"), CompareOperator.EQUAL, Bytes.toBytes("3")); filter.setFilterIfMissing(true); scan.setFilter(filter); // Specify returned columns // If returned columns not included in index table, will query back user table, // it's not the fast way to get data, suggest to cover all needed columns. // If you want to confirm whether using index for scanning, please set hbase client log level to DEBUG. scan.addColumn(Bytes.toBytes("info"), Bytes.toBytes("id")); scan.addColumn(Bytes.toBytes("info"), Bytes.toBytes("age")); scan.addColumn(Bytes.toBytes("info"), Bytes.toBytes("name")); LOG.info("Scan indexed data."); try (Table table = conn.getTable(tableName); ResultScanner scanner = table.getScanner(scan)) { for (Result result : scanner) { for (Cell cell : result.rawCells()) { LOG.info("{}:{},{},{}", Bytes.toString(CellUtil.cloneRow(cell)), Bytes.toString(CellUtil.cloneFamily(cell)), Bytes.toString(CellUtil.cloneQualifier(cell)), Bytes.toString(CellUtil.cloneValue(cell))); } } LOG.info("Scan data by index successfully."); } catch (IOException e) { LOG.error("Scan data by index failed ", e); } LOG.info("Exiting testScanDataByIndex."); }
  • 代码样例 以下代码片段在com.huawei.bigdata.hbase.examples包的“GlobalSecondaryIndexSample”类中。 本样例用于查询指定id对应的id、age、name信息,并命中idx_id_age索引,由于查询结果被完全覆盖,且无需回原表查询,能够达到最优的查询性能。 /** * Scan data by secondary index. */ public void testScanDataByIndex() { LOG.info("Entering testScanDataByIndex."); Scan scan = new Scan(); // Create a filter for indexed column. SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("info"), Bytes.toBytes("id"), CompareOperator.EQUAL, Bytes.toBytes("3")); filter.setFilterIfMissing(true); scan.setFilter(filter); // Specify returned columns // If returned columns not included in index table, will query back user table, // it's not the fast way to get data, suggest to cover all needed columns. // If you want to confirm whether using index for scanning, please set hbase client log level to DEBUG. scan.addColumn(Bytes.toBytes("info"), Bytes.toBytes("id")); scan.addColumn(Bytes.toBytes("info"), Bytes.toBytes("age")); scan.addColumn(Bytes.toBytes("info"), Bytes.toBytes("name")); LOG.info("Scan indexed data."); try (Table table = conn.getTable(tableName); ResultScanner scanner = table.getScanner(scan)) { for (Result result : scanner) { for (Cell cell : result.rawCells()) { LOG.info("{}:{},{},{}", Bytes.toString(CellUtil.cloneRow(cell)), Bytes.toString(CellUtil.cloneFamily(cell)), Bytes.toString(CellUtil.cloneQualifier(cell)), Bytes.toString(CellUtil.cloneValue(cell))); } } LOG.info("Scan data by index successfully."); } catch (IOException e) { LOG.error("Scan data by index failed ", e); } LOG.info("Exiting testScanDataByIndex."); }
  • 场景介绍 为了快速对用户数据创建索引,HBase提供了可通过MapReduce功能创建索引的TableIndexer工具,该工具可实现添加,构建和删除索引。具体使用场景如下: 在用户的表中预先存在大量数据的情况下,可能希望在某个列上添加索引。但是,使用addIndicesWithData()API添加索引会生成与相关用户数据对应的索引数据,这将花费大量时间。另一方面,使用addIndices()创建的索引不会构建与用户数据对应的索引数据。因此,为了为这样的用户数据建立索引数据,用户可以使用TableIndexer工具来完成索引的构建。 如果索引数据与用户数据不一致,该工具可用于重新构建索引数据。 如果用户暂时禁用索引并且在此期间,向禁用的索引列执行新的put操作,然后直接将索引从禁用状态启用可能会导致索引数据与用户数据不一致。因此,用户必须注意在再次使用之前重新构建所有索引数据。 对于大量现有的索引数据,用户可以使用TableIndexer工具将索引数据从用户表中完全删除。 对于未建立索引的用户表,该工具允许用户同时添加和构建索引。
  • 索引状态介绍 索引状态反映了索引当前的使用情况,全局二级索引支持以下五种状态: ACTIVE:索引正常,可以正常读写。 UNUSABLE:索引被禁用,索引数据会正常写入,查询时无法使用这个索引。 INACTIVE:索引异常,索引数据与数据表不一致,跳过生成这个索引的索引数据,查询数据时无法使用这个索引。 BUILDING:索引数据正常批量生成,索引数据生成工具执行结束会自动转换到ACTIVE状态,此状态下可以正常读写。 DROPPING:索引正在被删除,跳过生成这个索引的索引数据,查询数据时无法使用这个索引。 基于工具的索引状态修改,支持图1所示的状态转换。 图1 索引状态转换图
  • 使用方法 在HBase客户端执行以下命令可检查数据一致性,如果不一致,将重新构建索引数据。一致性检查结果会保存到“{数据表所在的NameSpace}:GSI_INCONSISTENCY_TABLE”表中。 hbase org.apache.hadoop.hbase.hindex.global.tools.GlobalHIndexConsistencyTool -dt table1 -n idx3 -src BOTH -r 相关参数介绍如下: -dt,--data-table:要进行一致性检查的数据表名称。 -n,--index-name:要进行一致性检查的索引名称。 -src,--source:检查模式选择,默认为“BOTH”,支持以下模式: INDEX_TABLE_SOURCE:索引表作为源表。 DATA_TABLE_SOURCE:数据表作为源表。 BOTH:索引表和数据表均作为源表。 -r,--repair:索引数据修复选项,添加此参数,表示检查后进行修复。 -sc,--scan-caching(可选) :一致性检查/修复的MapReduce任务中scan caching大小。
  • 场景介绍 HBase本身提供了ImportTsv&LoadIncremental工具来批量加载用户数据。当前提供了HIndexImportTsv来支持加载用户数据的同时可以完成对索引数据的批量加载。HIndexImportTsv继承了HBase批量加载数据工具ImportTsv的所有功能。此外,如果在执行HIndexImportTsv工具之前未建表,直接运行该工具,将会在创建表时创建索引,并在生成用户数据的同时生成索引数据。
  • 删除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:表示需要删除的索引名称,可以同时指定多个,用#号分隔。
  • 索引重建/不可用 使用ALTER INDEX可以设置索引是否可用。 例如,假设分区表range_ sales上存在索引range_sales_idx,可以通过如下命令设置其不可用。 ALTER INDEX range_sales_idx UNUSABLE; 可以通过如下命令重建索引range_sales_idx。 ALTER INDEX range_sales_idx REBUILD; 父主题: 分区表索引重建/不可用
  • 查看Dashboard图表 登录云搜索服务管理控制台。 在“集群管理”页面,选择已创建的集群,单击操作列“Kibana”,登录Kibana界面。 单击左侧导航栏的“Dashboard”,打开dashboard界面。 单击 “[Monitoring] Index monitoring Dashboard”查看预置dashboard。 图1 预置dashboard图表 预置dashboard展示集群的每秒读写数量和每秒读写数量前10的索引情况。 表1 预置图表说明 图表名称 说明 [monitoring] markdown Markdown图表,简单说明dashboard表达的内容。 [monitoring] Indexing Rate (/s) 集群每秒写入文档数。 [monitoring] Search Rate (/s) 集群每秒查询次数。 [monitoring] indexing rate of index for top10 每秒写入文档数最多的Top10索引。 [monitoring] search rate of index for top10 每秒查询次数最多的Top10索引。 [monitoring] total docs count 集群总文档数量变化。 [monitoring] total docs delete 集群总的删除文档数量变化。 [monitoring] total store size in bytes 集群总文档所占用的存储空间变化。 [monitoring] indices store_size for top10 占用存储空间最多的Top10索引。 [monitoring] indices docs_count for top10 文档数量最多的Top10索引。 [monitoring] indexing time in millis of index for top10(ms) 单位时间内文档写入时延最大的Top10索引(ms)。 [monitoring] search query time in millis of index for top10(ms) 单位时间内索引查询时间最大的Top10索引(ms)。 [monitoring] segment count of index for top10 索引Segment数量最多的Top10索引。 [monitoring] segment memory in bytes of index for top10 索引Segment占用堆内存最大的Top10索引。 索引监控不允许删除monitoring-eye-css-* 的index pattern,否则会导致监控图表异常。
  • 自定义Visualizations图表 索引监控定期把index/stats信息存储到monitoring-eys-css索引中,通过使用kibana图表功能可以绘制自定义的图表。 下面以文档数据为例介绍通过图表查看文档数量的变化趋势的操作步骤: 登录云搜索服务管理控制台。 选择已创建的集群,单击操作列“Kibana”,登录Kibana界面。 选择左侧的“Visualize”进入图形列表。 单击“Create visualization”,选择“TSVB” ,进入TSVB绘图页面。 设置图表参数,查看Visualizations。 如图所示,在“Data”页签,选择“index_stats.primaries.docs.count”表示主分片的文档数量;选择“Derivative”表示聚合桶之间的差异;“Unit”设置为“1s”表示使用每秒代替速率;选择“Positive only”避免数字重置后出现负数。如果需要区分不同索引的情况,将“Group by”设置为“Terms”,“By”设置为“index_stats.index”,最终得到的聚合结果将按照索引名称区分。 图2 TSVB绘图页面 如果需要查看不同时间段的数据,则需要将时间聚合间隔设置好,否则将导致数据显示不完整。在“Panel options”页签,将“Interval”设置为“1m”或“30m”,即可调整“timestamp”的时间间隔。 图3 设置时间间隔
  • 创建索引策略 登录Kibana,在左侧选择或“Index Management”,进入索引管理页面 。 右侧单击Create policy,创建索引策略。 在Configuration method对话框中,选择JSON editor,单击Continue进入创建索引策略页面。 在Policy ID部分输入策略ID,Define policy部分输入您的策略。 图1 配置策略 单击Create完成索引策略的创建。
  • 管理索引策略 在OpenSearch Dashboard的“Index Management”页面,选择Managed Indices。 如果您要更改策略,可以选择Change policy,详情请参考变更策略。 图5 变更策略 如果您要删除策略,请选择您的策略,然后选择Remove policy。 如果您要重试策略,请选择您的策略,然后选择Retry policy。 具体使用可参考索引管理官方介绍。
  • 注意事项 集群快照会导致CPU、磁盘IO上升等影响,建议在业务低峰期进行操作。 快照存储在OBS桶中需要额外收费,具体收费以对象存储服务为准。 如果OBS桶已经存储了快照,OBS无法变更,您可以使用这个方法修改:首先关闭快照功能,然后再开启快照功能,指定新的OBS桶。一旦关闭快照功能,之前创建的快照将无法用于恢复集群。 当集群处于“不可用”状态时,快照功能中,除了恢复快照功能外,其他快照信息或功能只能查看,无法进行编辑。 备份与恢复过程中,支持集群扩容、访问Kibana、查看监控、删除其他快照的操作。不支持重启此集群、删除此集群、删除正在创建或恢复的快照、再次创建或恢复快照的操作。补充说明,当此集群正在进行创建快照或者恢复快照时,此时,自动创建快照任务将被取消。 快照在恢复过程中不可查询集群数据。 CSS集群快照恢复到另一个集群会覆盖标集群中的同名索引,不同名的索引不会覆盖。如果两个集群的shard不一样,则同名的索引不会被覆盖。 用于恢复的目的集群版本不得低于源端集群,一般保持版本一致即可。
  • Local索引分区重建/不可用 使用ALTER INDEX PARTITION可以设置Local索引分区是否可用。 使用ALTER TABLE MODIFY PARTITION可以设置分区表上指定分区的所有索引分区是否可用。这个语法如果作用于二级分区表的一级分区,数据库会将这个一级分区下的所有二级分区均进行设置。 使用ALTER TABLE MODIFY SUBPARTITION可以设置二级分区表上指定二级分区的所有索引分区是否可用。 例如,假设分区表range_sales上存在两张Local索引range_sales_idx1和range_sales_idx2,假设其在分区date_202001上对应的索引分区名分别为range_sales_idx1_part1和range_sales_idx2_part1。 下面给出了维护分区表分区索引的语法: 可以通过如下命令设置分区date_202001上的所有索引分区均不可用。 ALTER TABLE range_sales MODIFY PARTITION date_202001 UNUSABLE LOCAL INDEXES; 或者通过如下命令单独设置分区date_202001上的索引分区range_sales_idx1_part1不可用。 ALTER INDEX range_sales_idx1 MODIFY PARTITION range_sales_idx1_part1 UNUSABLE; 可以通过如下命令重建分区date_202001上的所有索引分区。 ALTER TABLE range_sales MODIFY PARTITION date_202001 REBUILD UNUSABLE LOCAL INDEXES; 或者通过如下命令单独重建分区date_202001上的索引分区range_sales_idx1_part1。 ALTER INDEX range_sales_idx1 REBUILD PARTITION range_sales_idx1_part1; 假设二级分区表list_range_sales上存在两张Local索引list_range_sales_idx1和list_range_sales_idx2,表下有一级分区channel1,其下属二级分区有channel1_product1、channel1_product2、channel1_product3,二级分区channel1_product1上对应的索引分区名分别为channel1_product1_idx1和channel1_product1_idx2。 下面给出了维护二级分区表一级分区索引的语法: 可以通过如下命令设置分区channel1下属二级分区的所有索引分区均不可用,包括二级分区channel1_product1、channel1_product2、channel1_product3。 ALTER TABLE list_range_sales MODIFY PARTITION channel1 UNUSABLE LOCAL INDEXES; 可以通过如下命令重建分区channel1下属二级分区的所有索引分区。 ALTER TABLE list_range_sales MODIFY PARTITION channel1 REBUILD UNUSABLE LOCAL INDEXES; 下面给出了维护二级分区表二级分区索引的语法: 可以通过如下命令单独设置二级分区channel1_product1上的所有索引分区均不可用。 ALTER TABLE list_range_sales MODIFY SUBPARTITION channel1_product1 UNUSABLE LOCAL INDEXES; 可以通过如下命令重建二级分区channel1_product1上的所有索引分区。 ALTER TABLE list_range_sales MODIFY SUBPARTITION channel1_product1 REBUILD UNUSABLE LOCAL INDEXES; 或者通过如下命令单独设置二级分区channel1_product1上的索引分区channel1_product1_idx1不可用。 ALTER INDEX list_range_sales_idx1 MODIFY PARTITION channel1_product1_idx1 UNUSABLE; 通过如下命令单独重建二级分区channel1_product1上的索引分区channel1_product1_idx1。 ALTER INDEX list_range_sales_idx1 REBUILD PARTITION channel1_product1_idx1; 父主题: 分区表索引重建/不可用