文档章节

HBase二级索引方案总结

m
 miscellanea
发布于 2015/08/24 19:30
字数 1066
阅读 468
收藏 1

码上生花,ECharts 作品展示赛正式启动!>>>

在HBase中,表格的Rowkey按照字典排序,Region按照RowKey设置split point进行shard,通过这种方式实现的全局、分布式索引,成为了其成功的最大的砝码。图1显示了HBase表格的Rowkey切分与Region的部署关系图。

图1: HBase Rowkey-Region 关系图


然而,随着在HBase系统上应用的驱动,人们发现Global-Rowkey-Indexing不再满足应用的需求。单一的通过Rowkey检索数据的方式,不再满足更多应用的需求,人们希望像SQL一样检索数据,select * from table where col=val。可是,HBase之前的定位是大表的存储,要进行这样的查询,往往是要通过类似Hive、Pig等系统进行全表的MapReduce计算,这种方式既浪费了机器的计算资源,又因高延迟使得应用黯然失色。于是,在业界和社区,针对HBase Secondary Indexing的方案,成为HBase新版本(0.96)呼声最高的一项Feature。

 

粗略分析了当前的技术,大概的方案可以总结为这样两类:

1、使用HBase的coprocessor。CoProcessor相当于HBase的Observer+hook,目前支持MasterObserver、RegionObserver和WALObserver,基本上对于HBase Table的管理、数据的Put、Delete、Get等操作都可以找到对应的pre***和post***。这样如果需要对于某一项Column建立Secondary Indexing,就可以在Put、Delete的时候,将其信息更新到另外一张索引表中。如图二所示,对于Indexing里面的value值是否存储的问题,可以根据需要进行控制,如果value的空间开销不大,逆向的检索又比较频繁,可以直接存储在Indexing Table中,反之则避免这种情况。

图2 使用HBase Coprocessor实现Secondary Indexing

2、由客户端发起对于主表和索引表的Put、Delete操作的双重操作。源自:http://hadoop-hbase.blogspot.com/2012/10/musings-on-secondary-indexes.html 【墙外】

它具体的做法总结起来有:

  • 设置主表的TTL(Time To Live)比索引表小一点,让其略早一点消亡。
  • 不要在IndexingTable存储Value值,即删除如图2所示的val列。
  • Put操作时,对于操作的主表的所有列,使用同一的Local TimeStamp的值,更新到Indexing Table,然后使用该TimeStamp插入主表数据。
  • Delete操作时,首先操作主表的数据,然后再去更新Indexing Table的数据。

虽然在这种方案里无法保证原子性和一致性,但是通过TimeStamp的设置,No Locks和 No Server-side codes,使其在二级索引上有着较大的优势。至于中间出错的环节,我们看看是否可以容忍:

1)Put索引表成功,Put主表失败。由于Indexing Table不存储val值,仍需要跳转到Main Table,所以这样的错误相当于拿一个Stale index去访问对应Rowkey吧了,对结果正确性没有影响。

2)Delete主表成功,Delete索引表失败。都是索引表的内容>=主表的内容而已,而实际返回值需要通过主表进行。

 

生产环境下,什么样的方法实用性更强?

就这个问题,根据个人当前对于生产环境下HBase集群的经验,综合上面两种方式的优劣,可以通过这样的方式设计。

 

1、主表服务在线业务,它的性能需要保证。使用coprocessor和客户端的封装也好,都会影响其性能,所以在正常情况下,直接操作都不太合适。如果想使用方案二,我倒是感觉,可以调整Indexing Table的操作方式,去除保证其安全性的内容,比如可以关闭写HLOG,这样会进一步减低其操作的延迟。

2、离线更新索引表。在真正需要二级索引的场景内,其时效性要求往往不高。可以将索引实时更新到Redis等KV系统中,定时从KV更新索引到Hbase的Indexing Table中。PS:Redis里面有DB设置的概念,可以按照时间段进行隔离,这样某段时间内的数据会更新到Redis上,保证Redis导入MapReduce之后仍然可以进行update操作。

本文转载自:http://blog.sina.com.cn/s/blog_4a1f59bf01018apd.html

m
粉丝 6
博文 86
码字总数 22525
作品 0
海淀
私信 提问
加载中
请先登录后再评论。
HBase RowKey与索引设计

HBase的存储形式 hbase的内部使用KeyValue的形式存储,其key时rowKey:family:column:logTime,value是其存储的内容。 其在region内大多以升序的形式排列,唯一的时logTime是以降序的形式进...

osc_15ajvvu8
2019/03/26
2
0
云HBaseSQL及分析-Phoenix&Spark

在2018年1月的数据库直播大讲堂峰会HBase专场,来自阿里云的研发工程师瑾谦和沐远分享了云HBaseSQL以及分析Phoenix&Spark。本文介绍了详细了Phoinix和Spark的架构,适用性以及优缺点,并在最...

HBase技术社区
2018/06/05
0
0
浅谈Phoenix在HBase中的应用

一、前言 业务使用HBase已经有一段时间了,期间也反馈了很多问题,其中反馈最多的是HBase是否支持SQL查询和二级索引,由于HBase在这两块上目前暂不支持,导致业务在使用时无法更好的利用现有...

osc_o7tmguzk
2018/01/28
4
0
HBase二级索引与Join

二级索引与索引Join是Online业务系统要求存储引擎提供的基本特性。RDBMS支持得比较好,NOSQL阵营也在摸索着符合自身特点的最佳解决方案。 这篇文章会以HBase做为对象来探讨如何基于Hbase构建...

红薯
2011/11/23
6.4K
0
阿里云EMR异步构建云HBase二级索引

一、非HA EMR构建二级索引 云HBase借助Phoenix实现二级索引功能,对于Phoenix二级索引的详细介绍可参考https://yq.aliyun.com/articles/536850?spm=a2c4e.11153940.blogrightarea544746.26.6...

shining0227
2018/09/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

JeecgBoot 连接达梦数据库

JeecgBoot连接达梦数据库 一、达梦数据库官网下载地址 http://www.dameng.com/down.aspx?TypeId=11&FId=t14:11:14 项目采用DMB8开发版(windows64位) 二、需要两个jar,可在达梦数据库安装...

JEECG开源社区
53分钟前
26
0
迅捷CAD转换器好不好用?

大家在工作中有掌握一些必备的CAD小技巧吗?比如怎么实现DWG与DXF互转?我们应该使用什么工具?下面小张给大家带来一款实用软件(迅捷CAD转换器)的图文教程分享,有兴趣和有需要的小伙伴们仔...

逆风小师傅
54分钟前
19
0
gitee仓库管理入门

gitee就是码云。只是入门笔记。 1.gitee注册,git下载安装。这个简单就不说了。 查看git配置: git config --list 配置用户名 邮箱 密码 git config --global user.name "用户名"git co...

仙游度尾东峰黄恩赐
55分钟前
17
0
Linux初学之bash相关

bash的颜色显示规则: ascll编码对于颜色进行设置 \033: ctrl键 [ :控制字符和颜色代码之间的间隔字符 0m:关闭颜色属性的命令 1m:对于显示的文本字符进行加粗 4m:为文本字符加下划线标识...

osc_umiwij2c
55分钟前
19
0
linux初学之——权限管理

上篇已经提到用户和组的管理相关知识,我们已经学会了如何在Linux系统中创建了用户和组,并对用户和组的内容和属性做一些修改。但是我们知道Linux系统是多用户多任务的操作系统,多个合法用户...

osc_znv7pwo3
57分钟前
23
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部