HBase Region级别二级索引
我们会经常谈及二级索引,这是对全表数据进行另外一种方式的组织存储,是针对table级别的。如果要为HBase上的表实现一个强一致性的二级索引,那么就无法逃避分布式事务,而这一直是用户最期待的功能。 而即使只需要保证最终一致性,这个索引也并不好实现,因为你需要额外的表以存储过程数据,需要解决宕机恢复问题等
撇开分布式事务,我们是否可以考虑对索引的要求进行降级,比如把Region看成是全表下的子表,实现一套Region级别的索引,通过功能上的牺牲以换取实现的简易及稳定。
在某些存在用户概念的场景下,比如消费记录,我们总是会在确定的用户下,进行数据查找。这意味着,在此类场景中,我们只需要一个用户级别的索引。
举个例子,对于一笔交易记录,我们至少会有这么几个维度:
用户Id,交易时间,交易金额,交易状态(还会有交易名称,交易号ID,对方ID等)
当存储于HBase时,一般可以这么组织:
RowKey= 用户Id+交易时间
列1=交易金额
列2=交易状态
所以当我们要读取某个用户的在某段时间内的交易记录的时候,我们可以设置一个Scan:
startRow=用户Id+开始时间
stopRow=用户Id+结束时间
如果我们要增加查找条件,进行过滤,比如要读取某个用户在某段时间内交易状态为取消的交易记录,我们可以为上述Scan设置一个Filter,来过滤不符合查询条件的结果。
如果这是一个大商户,某段时间内的交易记录数巨多,通过设置Filter来过滤的方式就显得效率低下,开销巨大。
为了优化此类查找,业务只能自建索引表,可以如下组织:
RowKey= 用户Id+交易状态+交易时间
列1=交易金额
由此产生的问题时,当产生一笔交易记录的时候,我们需要向2张表中写入数据,不用说原子性,为了保证最终一致性,也得会花费不少的力气
彼之痛,己之痛,或许一个Region级别的索引存储能有一定的疗效。
什么是Region级别的索引存储
我们知道在HBase的结构中,一个Region可以包含多个Store,而索引存储则也是Region下面的一个Store,我们称其为Assistant Store,但它会有一些不同点:
a.Assistant Store中的数据由Regionserver按照用户配置的规则自动写入,是源数据的一份拷贝,但是拥有不同的组织方式
b.Assistant Store中的数据可以不遵守Region的Row范围限制
c.Assistant Store中的数据由用户主动选择读取(不会智能的自动利用)
d.Assistant Store中的数据在Split时,遵守与源数据对应的原则
(可以先看例子)
一个简单的例子
假设现在表只有一个Region,往表写入以下6行数据:
r1/c1:q1/v1
r2/c1:q1/v2
r3/c1:q1/v1
r4/c1:q1/v2
r5/c1:q1/v1
r6/c1:q1/v2
如果我们已为这个表配置了一个简单的索引存储,该Assistant Store命名为c2,那么除了上面的数据,Region中还会包含以下数据:
v1/c2:q1/r1
v1/c2:q1/r3
v1/c2:q1/r5
v2/c2:q1/r2 (在插入源数据的时候自动生成,存在Assistant Store中)
v2/c2:q1/r4
v2/c2:q1/r6
显然,这些是简单的倒置索引数据(可以由用户定义生成的数据如何组织),当你对表进行正常的scan时候,你只能见到源数据,即r1,r2,…,r6。 但是你可以通过某种方式,访问Assistant Store中的数据,即v1,v2,以加快条件查找
Region分裂处理
如果我们将上面这个例子中的Region进行Split,Split row为’r4′,那么源数据就会被分落在两个子Region中,Daughter_A 和 Daughter_B;
Daughter_A 包含如下源数据:
r1/c1:q1/v1
r2/c1:q1/v2
r3/c1:q1/v1
Daughter_B 包含如下源数据:
r4/c1:q1/v2
r5/c1:q1/v1
r6/c1:q1/v2
Assistant Store中的生成数据会遵守与源数据对应的原则,
Daughter_A 的Assistant Store中的索引数据为:
v1/c2:q1/r1
v1/c2:q1/r3
v2/c2:q1/r2
Daughter_B 的Assistant Store中的索引数据为:
v1/c2:q1/r5
v2/c2:q1/r4
v2/c2:q1/r6
原子性和一致性
解决了数据组织的问题,我们来看看如何保证源数据和生成数据间的原子性和一致性。
从上面的例子描述中,我们知道,设置了索引存储后,当我们写入一行数据时,实际上会存储多行数据,但这多行数据都是在同个Region中,这意味着可以用一个本地事务解决这多行数据的事务写入。或许有些用户不知道,HBase-0.94版本早就实现了本地Region的多行事务。
回看Region级别的索引存储的特点
a.Assistant Store中的数据由Regionserver按照用户配置的规则自动写入,是源数据的一份拷贝,但是拥有不同的组织方式
用户可以通过扩展类Assistant,来生成自己定义的数据格式,存储到Assistant Store中,
比如对于r1/c1:q1/v1,你可以生成一行v1/c1:q1/r1, 也可以生成一行v1r1/c1:q1/r1,也可以生成多行,但是生成的数据有一个限制,就是value值必须为源数据中的row值,这是为了保证源数据与生成数据之间能对应起来,当Region进行分裂的时候,索引数据和源数据仍然是对应的
b.Assistant Store中的数据可以不遵守Region的Row范围限制
从上面的例子中,我们可以看出,Assistant Store中的数据的Row是由用户自定义的,所以其Row是任意的,不会在Region的Row范围内
c.Assistant Store中的数据由用户主动选择读取(不会智能的自动利用)
Assistant Store中的数据的写入用系统自动控制,但是目前的设计中,读取由用户主动发起
d.Assistant Store中的数据在Split时,遵守与源数据对应的原则
优劣分析
优点:
1.设计简单,实现方便
2.加速条件Scan ,提高效率
3.相比于不设置索引存储,写入性能几乎不受影响,因为多行数据只会写一次Log
(无论是分布式事务,或者用户自己写入多张表,都无法避免写入多行数据时要多次写Log)
缺点:
1.额外存储空间
2.相比于全局意义上的二级索引,使用上会有局限性
重新思考上面的交易记录的案例
如果有了Region级别的索引存储,我们可以为交易记录表设置1个或多个Assistant Store,
源数据的组织仍然同上:
RowKey= 用户Id+交易时间
列1=交易金额
列2=交易状态
Assistant Store中的数据组织为:
RowKey= 用户Id+交易状态+交易时间
列1=交易金额
虽然结构上和用户写多张表一样,但是不需要为解决原子性和一致性而烦恼。
当然细心的读者,会发现从Assistant Store中扫描出来的数据无法做到ordered by 源数据中的Row,要做到ordered by Assistant Store中的Row也得花一定的力气。
怎么使用索引存储?
功能的基本代码已开发完,可以见https://issues.apache.org/jira/browse/HBASE-8980
如何让目前的HBase用户平滑使用,也是一个不小的难题,主要是有这么几点。
1.API使用
按照目前的设计,用户需要通过Scan方式主动的去读取索引存储,示例
| 01 | //从源数据的Row上 限制扫描范围 |
| 02 | Scan scan = new Scan(); |
| 03 | scan.setStartRow(‘r1′); |
| 04 | scan.setStopRow(‘r7′); |
| 05 |
|
| 06 | //创建在Assistant Store运行的Scan,从v2 到 v2+ |
| 07 | Scan assistantScan = new Scan().setStartRow(‘v2′).setStopRow(‘v2′+’(byte)0×00′); |
| 08 | //设置这个以后,Region在解析的时候,会在Assistant Store上运行这个Scan |
| 09 | scan.setAssistantScan(assistantScan); |
| 10 |
|
| 11 | scanner = htable.getScanner(scan); |
| 12 | for(Result result:scanner){ |
| 13 | //输出 |
| 14 | v2/c2:q1/r2 |
| 15 | v2/c2:q1/r4 |
| 16 | v2/c2:q1/r6 |
| 17 | } |
2.Ordered by特性保证
目前实现中没有,准备后续再添加
3.已有数据的索引追加
目前实现中没有,准备后续再添加
转自:http://zjushch.iteye.com/blog/1910218
HBase Region级别二级索引的更多相关文章
- HBase协处理器同步二级索引到Solr
一. 背景二. 什么是HBase的协处理器三. HBase协处理器同步数据到Solr四. 添加协处理器五. 测试六. 协处理器动态加载 一. 背景 在实际生产中,HBase往往不能满足多维度分析,我们 ...
- 通过phoenix在hbase上创建二级索引,Secondary Indexing
环境描述: 操作系统版本:CentOS release 6.5 (Final) 内核版本:2.6.32-431.el6.x86_64 phoenix版本:phoenix-4.10.0 hbase版本: ...
- Hbase(三) hbase协处理器与二级索引
一.协处理器—Coprocessor 1. 起源Hbase 作为列族数据库最经常被人诟病的特性包括:无法轻易建立“二级索引”,难以执 行求和.计数.排序等操作.比如,在旧版本的(<0.92)Hb ...
- HBase 协处理器实现二级索引
HBase在0.92之后引入了coprocessors,提供了一系列的钩子,让我们能够轻易实现访问控制和二级索引的特性.下面简单介绍下两种coprocessors,第一种是Observers,它实际类 ...
- HBase协处理器同步二级索引到Solr(续)
一. 已知的问题和不足二.解决思路三.代码3.1 读取config文件内容3.2 封装SolrServer的获取方式3.3 编写提交数据到Solr的代码3.4 拦截HBase的Put和Delete操作 ...
- CDH6 高版本hbase+solr实现二级索引
之前的环境是单独下载的CDH组件包搭建的集群,但是因为hadoop版本过低导致漏洞无法修复,重新搭建高版本集群环境. 新集群环境: 主要组件:hadoop,hbase,zookeeper,Key-Va ...
- HBase 二级索引与Join
二级索引与索引Join是Online业务系统要求存储引擎提供的基本特性.RDBMS支持得比较好,NOSQL阵营也在摸索着符合自身特点的最佳解决方案. 这篇文章会以HBase做为对象来探讨如何基于Hba ...
- HBase二级索引与Join
转自:http://www.oschina.net/question/12_32573 二级索引与索引Join是Online业务系统要求存储引擎提供的基本特性.RDBMS支持得比较好,NOSQL阵营也 ...
- HBase二级索引方案总结
转自:http://blog.sina.com.cn/s/blog_4a1f59bf01018apd.html 附hbase如何创建二级索引以及创建二级索引实例:http://www.aboutyun ...
随机推荐
- Android监听屏幕解锁和判断屏幕状态
开发后台服务的时候经常需要对屏幕状态进行判断,如果是想要监听屏幕解锁事件,可以在配置里面注册action为 android.intent.action.USER_PRESENT的广播,则可以监听解锁事 ...
- java虚拟机 jvm 出入java栈 栈空间内存分配
java栈空间是一块线程私有的内存空间,java堆和程序数据密切相关,那么java栈就是和线程执行密切相关.线程最基本的执行行为就是函数的调用.每次函数调用其实是通过java栈传递数据的. 数据结构中 ...
- HTML5中 HTML列表/块/布局 韩俊强的博客
从简单到复杂HTML5详解:每日更新关注:http://weibo.com/hanjunqiang 新浪微博! 1.HTML列表 1.有序 2.无序 3.有序star属性 4.有序无序列表 代码: ...
- 1057. Stack (30) - 树状数组
题目如下: Stack is one of the most fundamental data structures, which is based on the principle of Last ...
- UNIX网络编程——分析一帧基于UDP的TFTP协议帧
下图是UDP的段格式: 相比TCP段格式,UDP要简单得多,也没啥好说的,需要注意的是UDP数据长度指payload加上首部的长度. 下面分析一帧基于UDP的TFTP协议帧: 以太网首部 0000: ...
- 精通CSS+DIV网页样式与布局--页面背景
上篇博客,我们主要简单的总结了CSS的图片效果,我们这回来讲讲CSS如何对网页的背景进行设置,网页的背景是整个网页的重要组成部分,她直接决定了整个网页的风格和色调.这篇博客简单的总结一下如何用CSS来 ...
- Android数据库框架——GreenDao轻量级的对象关系映射框架,永久告别sqlite
Android数据库框架--GreenDao轻量级的对象关系映射框架,永久告别sqlite 前不久,我在写了ORMLite这个框架的博文 Android数据库框架--ORMLite轻量级的对象关系映射 ...
- (NO.00003)iOS游戏简单的机器人投射游戏成形记(十七)
现在玩家选择机器人后,可以在屏幕上或手臂上点击来移动robot's arm了. 但是玩家选择一个机器人后没有视觉效果来表明哪个机器人被选中.玩家做了一个操作后没有视觉反馈会惹恼强迫症用户滴 ;) 这篇 ...
- 记一个逻辑bug
1 从数据库中找出一个学生能选的毕业设计(毕设的select or not 字段表示本题目是否已经被选 此时就按照其值为n来查询) 2 用户选择某个毕设后,先更新毕设表(select ...
- Unity插件 - MeshEditor(一) 3D线段作画 & 模型网格编辑器
之前,因为工作需要,项目中需要动态生成很多的电线,不能事先让模型做好,更不能用LineRenderer之类的,因为画出来没有3D的效果,最主要是拐角的时候还容易破面,而我们要的是真真实实纯3D的电线, ...