`
yiihsia
  • 浏览: 68170 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

关系型数据库到HBase的数据储存方式变迁

阅读更多

 

我是标题党,其实本文与hbase关系不大,只是把它作为列族数据库的代表来讲。从目前字眼上看,HBase比Bigtable无疑更具吸引力。题目改成:RDBMS到列族的数据储存方式变迁 更恰当。

如今Bigtable型(列族)数据库应用越来越广,功能也很强大。但是很多人还是把它当做关系型数据库在使用,用原来关系型数据库的思维建表、存储、查询。本文以hbase举例讲述数据模式的变化。

传统关系型数据库(mysql,oracle)数据存储方式主要如下:

图一

上图是个很典型的数据储存方式,我把每条记录分成3部分:主键、记录属性、索引字段。我们会对索引字段建立索引,达到二级索引的效果。

但是随着业务的发展,查询条件越来越复杂,需要更多的索引字段,且很多值都不存在,如下图:图二

上图是6个索引字段,实际情况可能是上百个甚至更多,并且还需要根据多个索引字段刷选。查询性能越来越低,甚至无法满足查询要求。关系型数据里的局限也开始显现,于是很多人开始接触NoSQL。

列族数据库很强大,很多人就想把数据从mysql迁到hbase,存储的方式还是跟图一或者图二一样,主键为rowkey。其他各个字段的数据,存储一个列族下的不同列。但是想对索引字段查询就没有办法,目前还没有比较好的基于bigtable的二级索引方案,所以无法对索引字段做查询。

这时候其实可以转换下思维,可以把数据倒过来,如下图:

图三

把各个索引字段的值作为rowkey,然后把记录的主键和属性值按照一定顺序存在对应rowkey的value里。上图只有一个列族,是最简单的方式。 Value里的记录可以设置成定长的byte[],多个记录集合通过移位快速查询到。

但是上面只适合单个索引字段的查询。如果要同时对多个索引字段查询,图三的方式需要求取出所有value值,比如查询“浙江”and“手机”,需要取出两个value,再解析出各自的主键求交。如果每条记录的属性有上百个,对性能影响很大。

接下来的变化是解决多索引字段查询的问题。我们将主键字段和属性字段分开存储,储存在不同的列族下,多索引查询只需要取出列族1下的数据求交,再去最小集合的列族2里取得想要的值。储存如图四:

图四

以上图数据举例:查询“浙江”AND“手机”

1、取出“浙江”、“手机”列族1下的数据,即{1,2,5}、{2,6}

2、对数据求交后得到{2}满足条件,{2}在”手机”(最小集合)下的index为{1}

3、取出“手机”列族二的数据,根据步骤2的index,取出结果{108,2,22234,12}

为什么是不同列族,而不是一个列族下的两个列?

列族数据库数据文件是按照列族分的。在取数据时,都会把一个列族的所有列数据都取出来,事实上我们并不需要把记录明细取出来,所以把这部分数据放到了另一个列族下。

接下来是对列族2扩展,列族2储存更多的列,用来做各种刷选、计算处理。如下图:图五

后来我感觉这玩样越来越像搜索了。。。

这是一个很典型的通过空间换时间的方案,通过大量数据冗余来提高查询性能。同时也带来了问题,就是数据一致性的问题。所以这种方案的应用场景是对海量历史数据做实时计算上。关于应用场景可以看我之前写的一篇文章:实时计算应用场景

而处理实时更新的数据或者经常修改的数据还是难点问题,也欢迎讨论或者加入我们团队一起解决这些难题

http://www.yiihsia.com/2011/08/%E5%85%B3%E7%B3%BB%E5%9E%8B%E6%95%B0%E6%8D%AE%E5%BA%93%E5%88%B0hbase%E7%9A%84%E6%95%B0%E6%8D%AE%E5%82%A8%E5%AD%98%E6%96%B9%E5%BC%8F%E5%8F%98%E8%BF%81/

 

1
2
分享到:
评论

相关推荐

    关系型数据库的数据导入Hbase

    关系型数据库(如MySQL、Oracle、SQL Server等)与非关系型数据库(如Hbase)在数据存储和处理上有着显著的区别。关系型数据库遵循ACID(原子性、一致性、隔离性和持久性)原则,适合结构化数据的存储,而Hbase作为...

    文档型数据库与关系型数据库的比较_陈婕.pdf

    虽然可以通过BLOB等方式存储非结构化数据,但在处理这些数据时不如文档型数据库灵活。 ##### 3.2 数据库结构 - **文档型数据库**:每个文档可以有不同的结构,这意味着同一集合中的文档不必拥有相同的字段。这种...

    NoSQL非关系型数据库

    NoSQL数据库摒弃了传统关系型数据库的设计理念,如固定的表结构和复杂的事务处理机制,转而采取更为灵活的数据模型和支持水平扩展的技术方案。 #### NoSQL兴起的原因 NoSQL的兴起主要归因于传统关系型数据库无法...

    大数据环境下使用Sqoop实现HBase与关系型数据库间的数据迁移

    文档具体讲解了 Sqoop 搭配 Hadoop、HBase 使用时的基本准备流程,详尽解析利用 Sqoop 把 MySQL 等关系型数据库中的记录迁移到 HBase 表的操作步骤及命令参数含义,并简述了逆向导出的可能性及其限制条件。...

    大数据处理:用 Sqoop 实现 HBase 与关系型数据库的数据互导

    内容概要:本文介绍了如何使用 Sqoop 在 HBase 和关系型数据库(如 MySQL 或 PostgreSQL)之间进行数据导入和导出。首先,文中详细描述了使用 Sqoop 导入数据的具体步骤,包括前提条件、创建 HBase 表以及执行 Sqoop...

    分布式数据库HBase安装配置与实践.doc

    - **配置hbase-site.xml**:编辑`/usr/local/hbase/conf/hbase-site.xml`,设置`hbase.rootdir`为HDFS上的存储路径,并将`hbase.cluster.distributed`设为`true`,指定HBase在分布式模式下运行。 3. **环境变量...

    非关系型数据库

    非关系型数据库(NoSQL,Not Only SQL)是一种不同于传统的关系型数据库的数据存储模型,它在近年来得到了广泛的关注和应用,特别是在大数据、实时分析、分布式系统等领域。NoSQL数据库的设计理念在于灵活性、可扩展...

    关系型数据库和NOSQL数据库的应用设计差异

    关系型数据库和NOSQL数据库在应用设计上存在显著差异,这些差异主要来源于它们各自的设计理念、存储方式、数据模型和优化策略等方面。为了深入理解这些差异,我们可以从HBase的应用实践入手,进行分析和对比。 ...

    Lucene与关系型数据库对比

    随着技术的发展,不同的数据处理方式应运而生,其中Lucene与关系型数据库作为两种主流的信息管理工具,各自在特定场景下展现出了独特的优势。本文旨在深入探讨Lucene与关系型数据库之间的差异,尤其是它们在全文检索...

    关系型数据库+Mysql+查询用户连续登陆天数+数据统计

    关系型数据库+Mysql+查询用户连续登陆天数+数据统计 关系型数据库+Mysql+查询用户连续登陆天数+数据统计 关系型数据库+Mysql+查询用户连续登陆天数+数据统计 关系型数据库+Mysql+查询用户连续登陆天数+数据统计 关系...

    关系型数据库的工作原理(翻译)

    关系型数据库是现代数据存储和管理的核心,尤其在企业级应用中占据主导地位。它们遵循一种称为关系模型的数据结构,这种模型基于数学家埃德加·科德的关系理论。本文将深入探讨关系型数据库的工作原理,包括其核心...

    DA∕T 82-2019 基于文档型非关系型数据库的档案数据存储规范.pdf

    DA∕T 82-2019 基于文档型非关系型数据库的档案数据存储规范.pdf DA∕T 82-2019 基于文档型非关系型数据库的档案数据存储规范.pdf

    阿里云分布式关系型数据库DRDS-最佳实践-D.docx

    阿里云分布式关系型数据库 DRDS 是一种云原生、分布式的关系型数据库,它提供了高性能、可扩展、安全可靠的数据存储和处理能力。为了帮助开发者更好地使用 DRDS,阿里云提供了 DRDS 最佳实践指南,旨在帮助开发者更...

    大部分数据库采用的是关系型数据库

    ### 关系型数据库与第三代数据库的发展...通过上述内容,我们可以了解到关系型数据库和第三代数据库的不同之处以及它们各自的特点和发展趋势。同时,对于不同类型的应用场景,如何选择合适的数据库系统也变得更为明确。

    山东大学 软件学院 非关系型数据库ppt.zip

    非关系型数据库(NoSQL)是一种不同于传统的关系型数据库的数据存储模型。在信息化时代,随着大数据、云计算和互联网应用的快速发展,NoSQL数据库因其高可扩展性、高性能、灵活的数据模型等特点,逐渐受到广泛的关注...

    实验四:NoSQL和关系数据库的操作比较

    1. **MySQL**:作为经典的关系型数据库管理系统(RDBMS),MySQL基于ACID(原子性、一致性、隔离性和持久性)原则,提供结构化数据存储,支持复杂的事务处理。在实验中,我们创建了一个名为`Student`的表,包含了`...

Global site tag (gtag.js) - Google Analytics