我们知道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的存储系统中数据存储在相同的表中的所有行的数据都会有相同的列族(这和关系型数据库的表一样,每一行数据都有相同的列)。
因为性能的原因,列族物理上包含一组列和它们的值。每一个列族拥有一系列的存储属性,例如值是否缓存在内存中,数据是否要压缩或者他的行key是否要加密等等。表格中的每一行拥有相同的列族,尽管一个给定的行可能没有存储任何数据在一个给定的列族中。
列的限定符是列族中数据的索引。例如给定了一个列族content,那么限定符可能是content:html
,也可以是content:pdf
。列族在创建表格时是确定的了,但是列的限定符是动态地并且行与行之间的差别也可能是非常大的。
数据模型举例理解:
HBase中存储的数据,表组织结构如下图所示:
上图为HBase中的一个表,由两个列族(Personal和Office)组成,每个列族都有两列。 包含数据的实体称为单元格,行根据行键进行排序。
为了更好的理解HBase中的多维数据存储模型,这里从上图的表中摘出一条数据,将它在HBase的表中的存储转化成如下图所表示的形式去理解他。
如果将HBase表中的数据理解成键值对存储的形式,那么也可以用如下图的形式来理解存储在HBase表中的数据。
Hbase表设计要点
- 行键是HBase表结构设计中最重要的一件事情,行键决定了应用程序如何与HBase表进行交互。如果没设计好行键还会影响从HBase中读出数据的性能。
- HBase的表结构很灵活,而且不关心数据类型,你可以以byte数组的形式存储任何数据。
- 存储在相同的列族中的数据具有相同的特性(易于理解)。
- HBase主要是通过行键来建立索引。
- HBase不支持多行事务,所有尽量在一次API请求操作中获取到结果。
- HBase中的键可以通过提取其hash值来保证键长度是固定的和均匀分布,但是这样做会牺牲键的数据排序和可读性。
- 列限定符和列族名字的长度都会影响I/O的读写性能和发送给客户端的数据量,所以给它们命名的时候应该尽量简短!