HBase简介及其数据模型详解

大数据技术 潘老师 3年前 (2021-04-26) 1870 ℃ (0) 扫码查看

我们知道HDFS 是大型数据集分析处理的文件系统,具有高延迟的特点。它更倾向读取整个数据集而不是某条记录,因此当处理低延迟的用户请求时,HBase是更好的选择。它能实现某条数据的快速定位,提供实时读写功能。下面我们详细介绍HBase的核心概念和应用。

HBase 简介

HBase即HadoopDataBase,是一个基于 HDFS和ZooKeeper的列式数据库,是一个可靠性、高性能、面向列、可伸缩、实时读写的分布式数据库。HBase具有可伸缩性,它自底向上地进行构建,能够简单地通过增加节点来达到线性扩展。

HBase利用Hadoop HDFS作为其文件存储系统,利用基于YARN的MapReduce来处理HBase中的海量数据,利用ZooKeeper作为其分布式协同服务,主要用来存储非结构化和半结构化的松散数据,也就是列存储的NoSQL数据库。

HBase并不是关系型数据库,它并没有严格的结构,而且不支持传统的SQL。它可以运用key-value方式进行数据的存储,同时在特定的情况下,能够做RDBMS不能做的事,基于HBase可以在廉价硬件构成的集群上管理超大规模的稀疏表。

当然,HBase也并不是适用于所有情况,首先要确保有足够数据的情况下使用HBase,如果数据达到数亿或者数十亿行,那么HBase是一个很好的选择,如果只有几百万或者几千万行的数招,则可以考虑使用传统的关系型数据库,主要原因是在数据量不是足够大时,所有的数据有可能在HBase的单个节点上,而其余的集群可能处于空闲状态。

另外,我们还要考虑的是HBase并没有RDBMS所提供的索引、事务、高级查询语言等功能,不可以将RDBMS构建的应用程序直接移植到HBase上。如果一定要将RDBMS移植到HBase上,则需要考虑重新设计。

HBase还有一个显著的特点就是它有许多支持线性和模块化扩展的功能。HBase 集群可以通过添加商业性服务器的RegionServers来扩展。例如,如果集群从10个RegionServers扩展到20个RegionServers,那么在存储和处理能力方面的性能也都会倍增。

HBase数据模型

数据模型图示:

HBase简介及其数据模型详解

核心概念:

HBase数据存储结构中主要包括:表、行、列、列族、列限定符、单元格和时间戳,下面将对HBase的数据存储模型的概念一一解释:

表(Table):

表的作用将存储在HBase的数据组织起来,一个HBase表格由多行组成。

行(Row):

行包含在表中,数据以行的形式存储在HBase的表中。HBase的表中的每一行数据都会被一个唯一标识的行键(Row Key)标识。行键没有数据类型,在HBase存储系统中行键总是被看作一个byte数组。HBase中的行里面包含一个key和一个或者多个包含值的列。行按照行的key字母顺序存储在表格中。因为这个原因,行的key的设计就显得非常重要。数据的存储目标是相近的数据存储到一起。一个常用的行的key的格式是网站域名。如果你的行的key是域名,你应该将域名进行反转(org.apache.www, org.apache.mail, org.apache.jira)再存储。这样的话,所有Apache域名将会存储在一起,好过基于子域名的首字母分散在各处。

列(Column):

HBase中的列包含用:分隔开的列族和列的限定符。

列族(Column Family):

在行中的数据都是根据列族分组,由于列族会影响存储在HBase中的数据的物理布置,所以列族会在使用前定义(在定义表的时候就定义列族),并且不易被修改。
在HBase的存储系统中数据存储在相同的表中的所有行的数据都会有相同的列族(这和关系型数据库的表一样,每一行数据都有相同的列)。

因为性能的原因,列族物理上包含一组列和它们的值。每一个列族拥有一系列的存储属性,例如值是否缓存在内存中,数据是否要压缩或者他的行key是否要加密等等。表格中的每一行拥有相同的列族,尽管一个给定的行可能没有存储任何数据在一个给定的列族中。

列限定符(Column Qualifier):

存储在在列族中的数据通过列限定符或列来寻址的,列不需要提前定义(不需要在定义表和列族的时候就定义列),列与列之间也不需要保持一致。列和行键一样没有数据类型,并且在HBase存储系统中列也总是被看作一个byte数组。

列的限定符是列族中数据的索引。例如给定了一个列族content,那么限定符可能是content:html,也可以是content:pdf。列族在创建表格时是确定的了,但是列的限定符是动态地并且行与行之间的差别也可能是非常大的。

单元格(Cell):

单元格是由行、列族、列限定符、值和代表值版本的时间戳组成的,单元格是HBase存储数据的具体地址。在单元格中存储具体数据都是以Byte数组的形式存储的,也没有具体的数据类型。

时间戳(Timestamp):

时间戳是给定值的一个版本号标识,每一个值都会对应一个时间戳,时间戳是和每一个值同时写入HBase存储系统中的。在默认情况下,时间戳表示数据服务在写入数据时的时间,但可以在将数据放入单元格时指定不同的时间戳值。

数据模型举例理解:

HBase中存储的数据,表组织结构如下图所示:
HBase简介及其数据模型详解
上图为HBase中的一个表,由两个列族(Personal和Office)组成,每个列族都有两列。 包含数据的实体称为单元格,行根据行键进行排序。
为了更好的理解HBase中的多维数据存储模型,这里从上图的表中摘出一条数据,将它在HBase的表中的存储转化成如下图所表示的形式去理解他。
HBase简介及其数据模型详解
如果将HBase表中的数据理解成键值对存储的形式,那么也可以用如下图的形式来理解存储在HBase表中的数据。
HBase简介及其数据模型详解

Hbase表设计要点

  • 行键是HBase表结构设计中最重要的一件事情,行键决定了应用程序如何与HBase表进行交互。如果没设计好行键还会影响从HBase中读出数据的性能。
  • HBase的表结构很灵活,而且不关心数据类型,你可以以byte数组的形式存储任何数据。
  • 存储在相同的列族中的数据具有相同的特性(易于理解)。
  • HBase主要是通过行键来建立索引。
  • HBase不支持多行事务,所有尽量在一次API请求操作中获取到结果。
  • HBase中的键可以通过提取其hash值来保证键长度是固定的和均匀分布,但是这样做会牺牲键的数据排序和可读性。
  • 列限定符和列族名字的长度都会影响I/O的读写性能和发送给客户端的数据量,所以给它们命名的时候应该尽量简短!

版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/java/bigdata/3075.html
喜欢 (6)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】