`
shenchunhui
  • 浏览: 147198 次
  • 来自: 杭州
社区版块
存档分类
最新评论

一种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)0x00');
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.已有数据的索引追加

目前实现中没有,准备后续再添加

 

3
0
分享到:
评论
1 楼 jd2bs 2013-10-28  
华为有一个开源项目,貌似核心思想也是一致的,其核心思想是保证索引表和主表在同一个region server上。
http://www.dengchuanhua.com/167.html
https://github.com/Huawei-Hadoop/hindex

相关推荐

    HBase二级索引

    HBase 二级索引是指在 HBase 之上建立的一种二级索引机制,用于提高查询效率。根据华为公布的 HBase 二级索引实现方案,本方案主要参照了该方案,设计了 HBase 的二级索引机制。 知识点一:HBase 二级索引实现方案...

    360HBASE二级索引的设计与实践

    ### 360HBASE二级索引的设计与实践 ...综上所述,360公司在HBase上实施的二级索引方案不仅解决了传统查询方式存在的局限性,还极大地提升了数据处理能力和业务灵活性,为后续的大数据分析工作奠定了坚实的基础。

    Hbase二级索引与JOIN

    ### HBase二级索引与JOIN知识点详解 #### HBase简介 - **定义**: HBase是一种分布式、面向列的NoSQL数据库系统,它基于Google Bigtable论文实现。 - **底层架构**: HBase的数据存储依赖于Hadoop Distributed File ...

    基于协处理器的HBase二级索引方法.pdf

    针对这一问题,本文提出了一种创新性的解决方案——基于协处理器(Coprocessor)的HBase二级索引方法。协处理器是一种嵌入在HBase服务器端的自定义代码,它可以在数据读写过程中执行用户定义的操作,为HBase提供了...

    hbase原理和设计

    二级索引通常采用以下几种方式实现: 1. **倒排索引(Inverted Index)**:建立非RowKey字段到RowKey的映射关系。 2. **自定义MapReduce程序**:编写MapReduce作业来实现特定的查询需求。 3. **HBase Coprocessor**:...

    HBase 实战经验分享.pdf

    HBase是一种基于Google Bigtable理念设计的开源分布式数据库,它构建于Hadoop的HDFS之上,提供了对大规模数据的随机实时读写能力。HBase的核心数据模型包括Table、Region、Column Family和KeyValue。Table是由多个...

    hbase-0.92.1.tar.gz

    8. **Secondary Index**:虽然HBase不直接支持二级索引,但可以通过实现自定义的Filter或者使用 Coprocessors 来实现类似的功能。 9. **Coprocessors**:这是一种可以在Region Server上运行的用户定义代码,用于...

    hbase入门和使用

    - HBase本身不支持二级索引,需要通过外部索引表来实现。 - HBase的运维相对数据库系统不够成熟,需要更精细的管理。 - NameNode单点问题,一旦NameNode发生故障,整个HBase集群会受到影响。 - RegionServer的故障...

    hbase-0.98.24

    7. 索引:虽然HBase本身不提供传统的二级索引,但可以通过使用Coprocessors或者外部索引服务如Solr来实现。 8. 客户端API:HBase提供了Java API,同时也支持多种其他语言的客户端,如Python、Ruby和PHP,方便各种...

    HBase+官方文档-高清文字版

    1. **HBase概述**:HBase是一种非关系型数据库(NoSQL),基于谷歌的Bigtable模型,采用键值对存储方式,支持实时读写,适用于大数据处理场景。它的核心特性包括行式存储、列族、时间戳和版本化。 2. **架构原理**...

    Hbase学习资料

    虽然HBase的查询能力相对有限,但可以通过创建二级索引来增强查询性能。例如,使用 phoenix 或 Coprocessors 可以实现更复杂的查询逻辑。 **8. 数据模型** HBase的数据模型由行、列族、列和时间戳组成。每个单元格...

    HBase使用的jar包

    以及利用二级索引和Coprocessors进行复杂查询等。 总之,HBase的jar包是我们在Hadoop项目中进行明细查询的关键。正确引入并使用这些jar包,可以让我们在大数据环境下高效地管理和查询数据,发挥HBase的强大功能。

    Apache HBase PrimerPDF

    此外,可以使用Secondary Index(二级索引)来改善特定查询性能,但需权衡额外的存储和复杂性。 7. **数据复制与容错**: HBase采用多副本策略保证数据可靠性,通过ZooKeeper协调,实现Region Server的故障切换和...

    《Learning HBase中文版》

    除了基本功能,HBase还支持复杂的数据操作,如时间戳版本控制、细粒度的权限控制和二级索引等。这些特性使得HBase在处理实时大数据时具有很高的灵活性。 最后,书中会涵盖HBase与其他组件的集成,如Hadoop ...

    hbase期末复习重点

    13. **Secondary Index**:HBase原生不支持二级索引,但可以通过实现自定义的RegionObserver来实现类似的功能。 14. ** Coprocessor**:Coprocessor是HBase的一种扩展机制,允许在Region Server上运行用户自定义的...

    HBase:The Definition Guide,HBase权威指南完全版

    此外,还涵盖了HBase的索引机制,如Bloom Filters和二级索引,它们对于优化查询性能至关重要。 在实际应用部分,书中通过一个名为Hush的示例项目,展示了如何构建一个URL缩短服务。Hush演示了HBase在实时数据处理和...

    Python-HBase中文参考指南

    但需要注意,HBase本身并不支持二级索引,索引通常需要在应用层实现。 ### 六、HBase的Region管理和负载均衡 HBase将大表分割为多个Region,每个Region由一个RegionServer管理。当Region大小超过预设阈值时,会...

    电信设备-基于HBase分布式环境下移动对象并行网格索引同步方法.zip

    对于索引,HBase本身不直接支持二级索引,但可以通过外部索引服务(如Bigtable的Bigtable Indexer)或者自定义的MapReduce作业来实现。 总的来说,"电信设备-基于HBase分布式环境下移动对象并行网格索引同步方法...

Global site tag (gtag.js) - Google Analytics