HBase是什么
HBase是基于Hadoop的、面向列的、NoSQL数据库,是一个针对半结构化数据的、开源的、多版本的、可伸缩的、高可靠的、高性能的、分布式的、面向列的动态模式数据库。其全称是Hadoop Database。
HBase的数据模型是稀疏排序映射表(Key/Value),其中键由行关键字、列关键字和时间戳构成。
HBase的目标是存储并处理大型数据、支持对大规模数据的随机和实时读写访问。
即便HBase仅用普通的硬件配置,也能够处理上亿的行和几百万的列所组成的超大型数据库。
Hadoop是一个高容错、高延时的分布式文件系统和高并发的批处理系统,不适用于提供实时计算,而HBase是可以提供实时计算的分布式数据库(但是需要占用大量的内存),其数据被保存在HDFS上,由HDFS保证其高容错性(HBase也可以使用本地文件系统)。
HBase上的数据是以二进制流的形式存储在HDFS上的数据块中的,可以用MapReduce处理,它将输出存储和并行计算有机地结合在一起。
HBase是按列簇进行数据存储的,每个列簇会包括很多列,并且这些列是经常需要同时处理的属性。换句话说,HBase把经常需要一起处理的列构成列簇一起存放,从而避免列需要对这些列进行重构的操作。在充分利用列式存储的同时,通过列簇减少列连接的需求。
HBase列式数据模型简介
数据模型概述
HBase是一个稀疏、多维度、有序的映射表。
这张表中每个单元是通过行键、列簇、列限定符和时间戳组成的索引来标识的。
每个单元的值是一个未经过解析的二进制数组,没有数据类型。
表中的每一行由一个或多个列簇组成,一个列簇中可以包含任意列。
在同一表下,每行所包含的列簇是相同的,即列簇的个数与名称都是相同的,但每一行中的每个列簇中的烈属可以不同。
HBase中的同一个列簇中的数据存储在一起,列簇支持动态扩展,随时可以添加新的列,无需提前定义列的数量。
所以,在表中会有的行在某些列上没有数据,因此HBase的表是稀疏的。
HBase 执行更新操作时,并不会删除数据旧的版本,而是生成一个新的版本,原有的版本仍然保留。
用户可以对 HBase 保留的版本数量进行设置。在查询数据库的时候,用户可以选择获取距离某个时间最近的版本,或者一次获取所有版本。
如果查询的时候不提供时间戳,那么系统就会返回离当前时间最近的那一个版本的数据。
HBase 提供了两种数据版本回收方式:一种是保存数据的最后3个版本;另一种是保存最近一段时间内的版本,如最近一个月。
数据模型的基本概念
HBase的数据存储在表中,具有行和列,是一个多维的映射结构。
表(Table)
HBase使用表组织数据,表由行和列组成,列会被划分为多个列簇。
其管理单位的级别相当于传统数据库中的库。
列簇(Column Family)
列簇的管理单位的级别相当于传统数据库中的表。
在定义表的时候就需要设置好列簇,表中所有的列都需要组织在列簇里面。
列簇一旦被确定,就不能轻易修改,因为它会影响到HBase真实的物理存储结构,但是列簇中的列限定符及其对应的值可以动态增删。
表中的每一行都有相同的列簇,但是但不需要每一行的列簇中都有相同的列,所以这是一种稀疏存储结构。这在一定程度上避免了数据冗余。
HBase中的列簇是一些列的集合,一个列簇的所有成员都有着相同的前缀,如course:history
和course:math
都是列簇course
的列。
行(Row)
在表中,每一行代表一个数据对象,每一行都是由行键(Row Key)和一个或多个列组成的。
行键是行的唯一标识符,行键没有特定的数据类型,以二进制存储,按字母顺序排列。
因为表的行是按照行键顺序来进行存储的,所以行键的设计非常重要。
设计行键的原则是:相关的行键要存储在接近的位置,例如在设置就网站的表时,行键应当将域名反转,如
club.kwcoder.dream
、club.kwcoder.www
,这样可以使kwcoder.club
域名在表中的存储位置非常接近。
访问表中的行只有三种方式:
- 通过行键获取
- 通过行键区间获取
- 全表扫描
列限定符与列
列限定符不需要事先定义,也不需要在不同行之间保持一致,列限定符没有特地恩哥数据类型,以二进制字节来存储。
列由列簇和列限定符共同标识,使用:
间隔。
单元(Cell)
行键、列簇、列限定符一起标识一个单元,存储在单元里的数据称为单元数据,没有特定类型,以二进制字节来存储。
时间戳(Timestamp)
HBase提供基于单元的版本管理功能,版本号默认通过时间戳来表示,倒序排列。