《HBase实战》一2.5 数据模型

2.5 数据模型

HBase实战
正如你看到的那样,HBase进行数据建模的方式和你熟悉的关系型数据库有些不同。关系型数据库围绕表、列和数据类型——数据的形态使用严格的规则。遵守这些严格规则的数据称为结构化数据。HBase设计上没有严格形态的数据。数据记录可能包含不一致的列、不确定大小等。这种数据称为半结构化数据(semistructured data)。

在逻辑模型里针对结构化或半结构化数据的导向影响了数据系统物理模型的设计。关系型数据库假定表中的记录都是结构化的和高度有规律的。因此,在物理实现时,利用这一点相应优化硬盘上的存放格式和内存里的结构。同样,HBase也会利用所存储数据是半结构化的特点。随着系统发展,物理模型上的不同也会影响逻辑模型。因为这种双向紧密的联系,优化数据系统必须深入理解逻辑模型和物理 模型。

除了面向半结构化数据的特点外,HBase还有另外一个重要考虑因素——可扩展性。在半结构化逻辑模型里数据构成是松耦合的,这一点有利于物理分散存放。HBase的物理模型设计上适合于物理分散存放,这一点也影响了逻辑模型。此外,这种物理模型设计迫使HBase放弃了一些关系型数据库具有的特性。特别是,HBase不能实施关系约束(constraint)并且不支持多行事务(multirow transaction)1。这种关系影响了下面几个主题。

2.5.1 逻辑模型:有序映射的映射集合

HBase中使用的逻辑数据模型有许多有效的描述。图2-6把这个模型解释为键值数据库。我们考虑的一种描述是有序映射的映射(sorted map of maps)。你大概熟悉编程语言里的映射集合或者字典结构。可以把HBase看做这种结构的无限的、实体化的、嵌套的版本。

我们先来思考映射的映射这个概念。HBase使用坐标系统来识别单元里的数据:[行键,列族,列限定符,时间版本]。例如,从users表里取出Mark的记录(见图2-7)。

理解映射的映射的概念时,把这些坐标从里往外看。你可以想象,开始以时间版本为键、数据为值建立单元映射,往上一层以列限定符为键、单元映射为值建立列族映射,最后以行键为键列族映射为值建立表映射。这个庞然大物用Java描述是这样的:Map<RowKey, Map<ColumnFamily, Map<ColumnQualifier, Map<Version, Data>>>>。不算漂亮,但是简单易懂。

注意我们说映射的映射是有序的。上述例子只显示了一条记录,即使如此也可以看到顺序。注意password单元有两个时间版本。最新时间版本排在稍晚时间版本之前。HBase按照时间戳降序排列各时间版本,所以最新数据总是在最前面。这种物理设计明显导致可以快速访问最新时间版本。其他的映射键按照升序排列。现在的例子看不到这一点,让我们插入几行记录看看是什么样子:

现在再次列出Users表的内容,可以看到:

实践中,设计HBase表模式时这种排序设计是一个关键考虑因素。这是另外一个物理数据模型影响逻辑模型的地方。掌握这些细节可以帮助你在设计模式时利用这个特性。

2.5.2 物理模型:面向列族

就像关系型数据库一样,HBase中的表由行和列组成。HBase中列按照列族分组。这种分组表现在映射的映射逻辑模型中是其中一个层次。列族也表现在物理模型中。每个列族在硬盘上有自己的HFile集合。这种物理上的隔离允许在列族底层HFile层面上分别进行管理。进一步考虑到合并,每个列族的HFile都是独立管理的。

HBase的记录按照键值对存储在HFile里。HFile自身是二进制文件,不是直接可读的。存储在硬盘上HFile里的Mark用户数据如图2-8所示。注意,在HFile里Mark这一行使用了多条记录。每个列限定符和时间版本有自己的记录。另外,文件里没有空记录(null)。如果没有数据,HBase不会存储任何东西。因此列族的存储是面向列的,就像其他列式数据库一样。一行中一个列族的数据不一定存放在同一个HFile里。Mark的info数据可能分散在多个HFile里。唯一的要求是,一行中列族的数据需要物理存放在一起。

如果users表有了另一个列族,并且Mark在那些列里有数据。Mark的行也会在那些HFile里有数据。每个列族使用自己的HFile意味着,当执行读操作时HBase不需要读出一行中所有的数据,只需要读取用到列族的数据。面向列意味着当检索指定单元时,HBase不需要读占位符(placeholder)记录。这两个物理细节有利于稀疏数据集合的高效存储和快速读取。

让我们增加另外一个列族到users表,以存储TwitBase网站上的活动,这会生成多个HFile。让HBase管理整行的一整套工具如图2-9所示。HBase称这种机制为region,我们下一章会讨论。

在图2-9中可以看到,访问不同列族的数据涉及完全不同的MemStore和HFile。列族activity数据的增长并不影响列族info的性能。

时间: 2024-10-31 06:18:19

《HBase实战》一2.5 数据模型的相关文章

《HBase实战》一导读

前 言 HBase实战 2008年秋季我开始和HBase结缘,当时它还是一个新生项目,一年前刚刚发布.早期版本出来时,HBase表现很不错,但是也不是没有令人尴尬的缺陷.HBase项目当时有近10个软件Commiffer,作为一个Apache子项目还算不错.接下来是NoSQL宣传的高潮.当时专有名词NoSQL还没有出现,但是随后的一年这个术语变成了通俗用语.没有人能够说清楚为什么NoSQL重要,只知道它就是重要,反正数据领域开源社区的每个人都对这个概念很着迷.社区中有两种声音,有人批评关系型数据

《HBase实战》一2.3 数据坐标

2.3 数据坐标 HBase实战在逻辑数据模型里,时间版本的数字也是数据的坐标之一.你可以想象,在关系型数据库里存储数据使用的是二维坐标系统,先是行后是列.照此类推,HBase在表里存储数据使用的是四维坐标系统. HBase使用的坐标依次是行键.列族.列限定符和时间版本.users表的坐标如图2-4所示. 当使用HBase API检索数据时,你不需要提供全部坐标.如果你在Get命令中省略了时间版本,HBase返回数据值多个时间版本的映射集合.HBase允许你在一次操作中得到多个数据,它们按照坐标

《HBase实战》一2.4 小结

2.4 小结 HBase实战现在知道了如何访问HBase,让我们在一个实际例子中练习已经学到的东西.首先为User实例定义一个简单模型对象,如代码清单2-1所示. 代码清单2-1 User的数据模型 然后在一个类中封装所有HBase访问操作.先声明普遍使用的字节数组byte[]常量,然后定义封装操作命令的方法,接下来是User模型的公有接口和私有实现,如代码清单2-2所示. 代码清单2-2 在UsersDAO.java里的CRUD操作 声明一次常用的 字节数组常量 省略导入细节 让调用环境来管理

《HBase实战》一2.6 表扫描

2.6 表扫描 HBase实战你可能发现,没有查询(query)命令.到目前为止,你都找不到这样的命令.查找包含某个特定值的记录的唯一办法是,使用扫描(Scan)命令读出表的某些部分,然后再使用过滤器(filter)来得到有关记录.可以想到,扫描返回的记录是排好序的.HBase设计上支持这种方式,因此速度很快. 要扫描得到整个表的内容,单独使用Scan构造函数即可: 但是,你经常只对整张表的一个子集感兴趣.比如,你想得到所有以字母T开头的ID的用户.给Scan构造函数增加起始行和结束行的信息即可

《HBase实战》一第一部分 HBase基础

第一部分 HBase基础 HBase实战 本书前三章介绍HBase的基本原理.第1章大体上回顾一下数据库技术的演变,并介绍HBase出现的特定背景. 第2章通过建立一个应用示例--TwitBase来讲授HBase的基础知识.通过这个示例,你可以学习如何访问HBase以及如何设计HBase的模式(schema),你会简单地了解到在应用系统中如何有效使用HBase. HBase是一种分布式系统,我们在第3章会探讨分布式架构.你将学习到HBase如何在集群中管理你的数据以及如何使用MapReduce访

《HBase实战》一2.8 ACID语义

2.8 ACID语义 HBase实战如果使用过数据库系统,你会听说过各种数据库系统提供的ACID语义.ACID是当你搭建使用数据库系统做存储的应用系统时需要掌握的一组要素.当应用系统访问承载它的数据库时,遵循这些要素可以使应用系统的行为更加合理.为简单起见,让我们再次定义ACID.记住,ACID不同于之前我们简要介绍过的CAP. Atomicity(原子性)- 原子性是指原子不可分的操作属性,换句话说,要么全部完成,要么全部不完成.如果操作成功,整个操作成功.如果操作失败,整个操作失败,系统会回

《HBase实战》一2.7 原子操作

2.7 原子操作 HBase实战HBase操作库里的最后一个命令是列值递增(Increment Column Value).它有两种使用方式,像其他命令那样使用Increment命令对象,或者作为HTableInterface的一个方法来使用.我们使用HTableInterface的方式,因为语义更直观.我们使用它来保存每个用户发布推帖的总数,如下所示: 该命令不用先读出HBase单元就可以改变存储其中的值.数据操作发生在HBase服务器上,而不是在你的客户端,所以速度快.当其他客户端也在访问同

《HBase企业应用开发实战》—— 3.6 本章小结

前 言 为什么要写这本书 大数据是继云计算.物联网之后IT行业又一次颠覆性的技术革命.大数据在互联网.军事.金融.通信和物理学等领域已经有不少落地案例,而Hadoop技术的快速发展也引起业界广泛关注.可以说,现在Hadoop是大数据处理的关键技术,也是迄今为止,最成熟.应用最广泛的技术. HBase原型是Google的BigTable论文,从基因上讲,HBase已经是Hadoop生态系统不可或缺的一部分.HBase是完全开源的,同时存在多个版本,并且版本升级非常快,其学习成本比较高,学习周期比较

《MapReduce 2.0源码分析与编程实战》一第1章 HBase介绍

第1章 HBase介绍 HBase实战本章涵盖的内容 Hadoop.HBase和NoSQL的起源 HBase的常见使用场景 HBase的基本安装 使用HBase存储和查询数据 HBase 是一种数据库:Hadoop数据库.它经常被描述为一种稀疏的.分布式的.持久化的.多维有序映射,它基于行键(rowkey).列键(column key)和时间戳(timestamp)建立索引.人们会说它是一种键值(key value)存储.面向列族的数据库,有时也是一种存储多时间戳版本映射的数据库.所有这些描述都