最具影响力的数字化技术在线社区

168大数据

 找回密码
 立即注册

QQ登录

只需一步,快速开始

1 2 3 4 5
打印 上一主题 下一主题
开启左侧

[Hbase] HBase二级索引实践

[复制链接]
跳转到指定楼层
楼主
发表于 2018-12-21 10:24:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多数据大咖,获取更多知识干货,轻松玩转大数据

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

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创建二级索引:

[AppleScript] 纯文本查看 复制代码
-- 创建二级索引(全局索引)
create global index index_num on hyper_table(num);

  • 在HBase shell中创建二级索引:
[AppleScript] 纯文本查看 复制代码
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;







走索引:
[AppleScript] 纯文本查看 复制代码
select /*+USE_INDEX(e USING index_num)*/ * from hyper_table e where num =503;






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


2、范围查询性能:
[AppleScript] 纯文本查看 复制代码
# 不走索引
select * from hyper_table where NUM>520 LIMIT 10;






[AppleScript] 纯文本查看 复制代码
# 走索引
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自动匹配合适的索引进行查询。切换方式如下:


[AppleScript] 纯文本查看 复制代码
# 切换Inceptor模式为Local Mode
set ngmr.exec.mode=local;
set hyperbase.integer.transform=true;



切换回Cluster模式如下:


[AppleScript] 纯文本查看 复制代码
# 将Inceptor切换为Cluster Mode
set 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'



作者:bw_233

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


楼主热帖
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖 赞 踩

168大数据 - 论坛版权1.本主题所有言论和图片纯属网友个人见解,与本站立场无关
2.本站所有主题由网友自行投稿发布。若为首发或独家,该帖子作者与168大数据享有帖子相关版权。
3.其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和168大数据的同意,并添加本文出处。
4.本站所收集的部分公开资料来源于网络,转载目的在于传递价值及用于交流学习,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。
5.任何通过此网页连接而得到的资讯、产品及服务,本站概不负责,亦不负任何法律责任。
6.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源,若标注有误或遗漏而侵犯到任何版权问题,请尽快告知,本站将及时删除。
7.168大数据管理员和版主有权不事先通知发贴者而删除本文。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

关于我们|小黑屋|Archiver|168大数据 ( 京ICP备14035423号|申请友情链接

GMT+8, 2024-5-7 11:32

Powered by BI168大数据社区

© 2012-2014 168大数据

快速回复 返回顶部 返回列表