分布式数据库HBase(1)
4.1HBase简介
(1)HBase是一个高可靠、高性能、面向列、可伸缩的分布式数据库,是谷歌BigTable的开源实现,主要用来存储非结构化和半结构化的松散数据。HBase的目标是处理非常庞大的表,通过水平扩展的方式,利用廉价计算机集群处理超过10亿行数据和数百万列元素组成的数据表。
(2)HBase与传统的关系数据库的区别主要体现在以下几个方面。
1.数据类型关系数据库采用关系模型,具有丰富的数据类型和存储方式。HBase则采用了更加简单的数据模型,它把数据存储为未经解释的字符串,用户可以把不同格式的结构化数据和非结构化数据都序列化成字符串保存到HBase中,用户需要自己编写程序把字符串解析成不同的数据类型。
2.数据操作关系数据库中包含了丰富的操作,如插人、删除、更新、查询等,其中会涉及复杂的多表连接,通常是借助于多个表之间的主外键关联来实现的。HBase操作则不存在复杂的表与表之间的关系,只有简单的插人、查询、删除、清空等,因为HBase在设计上就避免了复杂
的表与表之间的关系,通常只采用单表的主键查询,所以它无法实现像关系数据库中那样的表与表之间的连接操作。
3.存储模式关系数据库是基于行模式存储的,元组或行会被连续地存储在磁盘页中。在读取数据时,需要顺序扫描每个元组,然后从中筛选出查询所需要的属性。如果每个元组只有少量属性的值对于查询是有用的,那么基于行模式存储就会浪费许多磁盘空间和内存带宽。
HBase是基于列存储的,每个列族都由几个文件保存,不同列族的文件是分离的,它的优点是:可以降低IO开销,支持大量并发用户查询,因为仅需要处理可以回答这些查询的列,而不需要处理与查询无关的大量数据行;同一个列族中的数据会被一起进行压缩,由于同-列族内的数据相似度较
高,因此可以获得较高的数据压缩比。
**4.数据索引。**关系数据库通常可以针对不同列构建复杂的多个索引,以提高数据访问性能。与关系数据库不同的是,HBase只有一个索引行键, 通过巧妙的设计,HBase 中的所有访问方法,或者通过行键访问,或者通过行键扫描,从而使得整个系统不会慢下来。由于HBase位于adoop框架之上,因此可以使用Hadoop 来快速、高效地生成索引表。
5.数据维护在关系数据库中,更新操作会用最新的当前值去替换记录中原来的旧值,旧值被覆盖后就不会存在。而HBase中执行更新操作时,并不会删除数据旧的版本,而是生成一个新的版本,旧有的版本仍然保留。
6.可伸缩性关系数据库很难实现横向扩展,纵向扩展的空间也比较有限。相反,HBase和BigTable这些分布式数据库就是为了实现灵活的水平扩展而开发的,因此能够轻易地通过在集群中增加或者减少硬件数量来实现性能的伸缩。为谷费的器茂喜级最中发为文的回本政成发性,但是,相对于关系数据库来说,HBase 也有自身的局限性,如HBase不支持事务,因此无法实现跨行的原子性。
Hbase访问接口
4.2HBase数据模型
(1)数据模型概述:
HBase是一个稀疏、多维度、排序的映射表,这张表的索引是行键、列族、列限定符和时间戳。每个值是一个未经解释的字符串,没有数据类型。用户在表中存储数据,每一行都有一个可排序的行键和任意多的列。表在水平方向由一个或者多个列族组成,册4个列族中可以包含任意多个列,同一个列族里面的数据存储在一起。列族支持动态扩展,可以很轻松地添加一个列族或多个列族,无需预先定义列的数量以及类型,所有列均以字符串形式存储,用户需要自行进行数据类型转换。由于同一张表里面的每一行数据都可以有截然不同的列,因此对于整个映射表的每行数据而言,开有些列的值就是空的,所以说HBase是稀疏的。
在HBase中执行更新操作时。并不会删除数据旧的版本,而是生成个新的版本,旧有的版本仍然保留,HBase 可以对允许保留的版本的数量进行设置。客户端可以选择获取距离某个时间最近的版本,或者一次获取所有版本。如果在查询的时候不提供时间戳,那么会返回距离现在最近的那一个版本的数据,因为在存储的时候,数据会按照时间戳排序。HBase提供了两种数据版本回收方式: 一是保存数据的最后n个版本;二是保存最近一段时间内的版本(如最近7天)。
(2)数据模型的相关概念:
1.表:
HBase采用表来组织数据,表由行和列组成,列划分为若干个列族。
2.行:
每个HBase表都由若干行组成,每个行由行键( Row Key)来标识。访问表中的行只有3种方式:通过单个行键访问;通过一个行键的区间来访问;全表扫描。行键可以是任意字符串(最大长度是64 KB,实际应用中长度一般为10~100字节),在HBase内部,行键保存为字节数组。存储时,数据按照行键的字典序排序存储。在设计行键时,要充分考虑这个特性,将经常一起读取的行存储在一起。
3.列族:
一个HBase表被分组成许多“列族”的集合,他是基本的访问控制单元,列族需要在表创建的时候就定义好,数量不能太多,不要频繁修改,存储在一个列族中的所有数据,通常都属于同一种数据类型,意味着有更高的压缩率,表中的每个列都归属于某个列族,数据可以被存放在列族的某个列的下面。
4.列限定符:
列族里边的数据通过限定符来定位,列限定符不用事先定位,也不需要在不同行之间保持一致。列限定符没有数据类型,总被视为字节数组byte[]
5.单元格:
在HBase表中,通过行、列族和列限定符确定一个“单元格”。单元格中存储的数据没有数据类型,总被视为字节数组byte[]。每个单元格中可以保存一个数据的多个版本,每个版本对应一个不同的时间戳
6.时间戳:
每个单元格都保存着同-份数据的多个版本,这些版本采用时间戳进行索引。每次对一个单元格执行操作(新建、修改、删除)时,HBase都会隐式地自动生成并存储一个时间戳。时间戳一般是64位整型,可以由用户自己赋值(自己生成唯一时间戳可以避免应用程序中出现数据版本冲突),也可以由HBase在数据写入时自动赋值。一个单元格的不同版本是根据时间戳降序的顺序进行存储的,这样,最新的版本可以被最先读取。下面以一个实例来阐释HBase的数据模型。图4-2是一张用来存储学生信息的HBase表,学号作为行键来唯一-标识每个学生,表中设计了列族Info用来保存学生相关信息,列族Info中包含3个列一一name major和email,分别用来保存学生的姓名、专业和电子邮件信息。学号为“201505003”的学生存在两个版本的电子邮件地址,时间截分别为ts1-1174184619081和s2-184620720,时间戳较大的数据版本是最新的数据。
(3)数据坐标:
HBase使用坐标来定位表中的数据,也就是说,每个值都是通过坐标来访问的。对于我们熟悉的关系数据库而言,数据定位可以理解为采用“二维坐标",即根据行和列就可以确定表中一个具体的值。但是,HBase中需要根据行键、列族、列限定符和时间戳来确定一= 个单元格,因此可以视为一个“四维坐标”,即[行键,列族,列限定符,时间戳]
(4)概念视图
HBase是一个稀疏的表,表中很多数据是空的。
(5)物理视图
实际上把行键,时间戳和列族拿出来单独存储。
(6)面向列的存储
传统数据库是面向行的存储
优点对传统事务性操作,会把各项信息都存入数据库,每一次都生成一个完整的记录
缺点分析一列数据时,取数据需要一行一行的取出,虽然每行只读取一个数据,但每一行都需要读取,对数据分析不友好,且不可能达到很高的数据压缩率
HBase面向列的存储
优点很高的数据压缩率,分析型应用为主时有优势