博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HBase二级索引实践(带你感受二级索引的力量)
阅读量:4218 次
发布时间:2019-05-26

本文共 2026 字,大约阅读时间需要 6 分钟。

hyper_table之前HBase SQL BulkLoad环节创建的,我们将数据通过BulkLoad方式导入预先分好Region的hyper_table表中。具体参考如下博文:

HBase中利用SQL BulkLoad快速导入数据

这里大家只要清楚此表结构即可,结构如下:

hyper_table表结构
字段 rowkey num country rd
类型 string int int string

创建二级索引(全局索引)

我们有两种方式创建索引,一种是利用SQL通过Inceptor分布式SQL引擎与HBase交互,创建二级索引。另一种是直接在HBase shell中创建二级索引。两者创建时都需要指定索引的名字、索引所在表的名字、创建的索引列

  • 在Inceptor中利用SQL创建二级索引:
-- 创建二级索引(全局索引)create global index index_num on hyper_table(num);
  • 在HBase shell中创建二级索引:
add_index 'hyper_table','index_num','COMBINE_INDEX|INDEXED=f:q2:8|rowKey:rowKey:9'

创建好的索引在Hbase中会以表的形式存在表名为 "表名_索引名" ,如下所示

rebuild二级索引

rebuild命令为生成索引的命令,他会在上一步生成的索引表中插入索引数据,生成二级索引。进入到HBase Shell,重构索引。(注:Inceptor目前不支持SQL生成索引,仅支持创建二级索引

rebuild_global_index '{$yourDBName}:hyper_table', 'index_num';

可以看到,生成二级索引的过程 需要用到之前创建好的索引信息、表region信息

底层是通过mapreduce任务生成的。

测试二级索引性能

1、精准查询性能:

不走索引:

select * from hyper_table where num=503;

走索引:

select /*+USE_INDEX(e USING index_num)*/ * from hyper_table e where num =503;

可以看到,num列走二级索引的情况下,精准查询的性能有明显提升。因为不走索引,HBase会从第一条记录开始遍历全表,而走索引,直接通过索引表查询到对应的num值即可。

2、范围查询性能:

# 不走索引select * from hyper_table where NUM>520 LIMIT 10;

# 走索引select /*+USE_INDEX(e USING index_num)*/ * from hyper_table e where num >520 LIMIT 10;

注意:后来测试发现,虽然精准查询走二级索引效率明显提升,但如果是范围查询,则走二级索引效率反而更低,经过分析发现,在重构基于num列的二级索引(全局索引)时,会将num进行升序排序,故走不走索引查询时间大致相同,而不走索引直接访问原表省去了查询索引表的时间,故在范围查询情况下,不走索引效率更高。 

(补充1)何时会走索引?

Inceptor默认运行在Cluster Mode下,查询时不基于索引,因为对索引文件的访问可能会比较慢。在Cluster Mode下,只有明确声明(/*+USE_INDEX(e USING index_num)*/ *),Inceptor才基于索引进行查询

如果我们将Inceptor切换为Local Mode,Inceptor自动匹配合适的索引进行查询。切换方式如下:

# 切换Inceptor模式为Local Modeset ngmr.exec.mode=local;set hyperbase.integer.transform=true;

切换回Cluster模式如下:

# 将Inceptor切换为Cluster Modeset ngmr.exec.mode=cluster;

(补充2)无法创建二级索引的解决办法:

可能是因为名称冲突问题,解决方法删除原先二级索引,重新创建。

因为二级索引在HBase中也是以表的形式存在的,如之上的例子,hypet_table的num列的索引存在hyper_table_index_num表里,我们直接disable掉它,再drop掉,之后就能重新创建了(通过Inceptor中的SQL或者HBase shell皆可)。

# 下线二级索引表disable 'hyper_table_index_num'# 删除二级索引表drop 'hyper_table_index_num'

原文:https://blog.csdn.net/whdxjbw/article/details/81146440 

你可能感兴趣的文章
最优化算法之梯度下降法
查看>>
激活函数之ReLU函数
查看>>
经典排序算法详解
查看>>
概述类加载器及类加载过程
查看>>
MySQL SQL优化总结
查看>>
MySQL MyISAM引擎的读锁与写锁
查看>>
面向对象与面向过程的本质的区别
查看>>
Java语言有哪些特点?
查看>>
idea创建maven项目并关联gitee
查看>>
HashMap和Hashtable的区别
查看>>
JVM 对 Java 的原生锁做了哪些优化?
查看>>
JAVA实现简单的阻塞队列
查看>>
我的2020
查看>>
idea快捷键使用
查看>>
2.1MAC协议概述
查看>>
2.3 WSN的MAC协议
查看>>
图解后缀表达式的计算过程
查看>>
栈与队列的应用——计算表达式的值
查看>>
静态链表——sharing
查看>>
静态链表——sorting
查看>>