HBase: 为分布式,扩展性和速度而设计
HBase是运行在Hadoop集群上的数据库。HBase不同于传统的RDBMS,因为它放宽了对传统RDBMS数据库ACID (Atomicity(原子性), Consistency(一致性), Isolation(隔离性), and Durability(持久性)) 属性的要求,已实现更高的扩展性。Hbase存储的数据也不需要符合RDBMS严格的模式,因此他非常适合存储非结构化和半结构化数据。
HBase允许构建大数据应用以及进行扩展,但与使用传统数据库构建应用程序相比,在实现上有一些区别。在此博文中,将提供HBase的概述,了解传统数据可的局限性,并深入探讨HBase数据模型的具体细节。
Relational Databases vs. HBase – 数据存储模型
为什么我们需要使用NoSQL/HBase?首先,在讨论传统数据库的局限性之前,我们先看看传统数据库的优点:
- 关系型数据库提供了一个标准的持久模型
- SQL 是数据操作(SQL)的标准
- 关系型数据库管理事务的并发性
- 关系型数据具有丰富的工具
关系数据库是多年的标准,因此有哪些已经改变了呢?随着越来越多的数据需要扩展。一种方式是使用更大的服务器进行垂直扩展,但这可能会非常昂贵,并且随着数据量增加而存在限制。
Relational Databases vs. HBase - 扩展性
NoSQL带来了那些改变?
使用硬件的水平扩展代替垂直扩展。使其跟便宜,更可靠。要实现RDBMS的水平分区或者分片,数据是基于行分配的,一些行分布在一台机器上,其他行分布在其他机器上,但是对关系型数据进行分区或者分片非常复杂,他并没有自动执行此操作的设计。此外,会丢失跨分片的查询,事务和一致性控制。关系数据库是为单个节点设计的;它们不是为了在集群上运行而设计的。
关系模型的限制
数据库规范化消除了冗余数据,从而提高了存储效率。然而,标准化数据需要使用关联查询,以便再次将数据重新组合在一起。尽管HBase不支持关系和连接,但访问的数据会存储在一起,因此可以避免关系模型相关的限制。查看下图中数据存储模型的差异:
Relational databases vs. HBase - Scaling
HBase 为分布式,扩展性和速度而设计
HBase水平扩展基于数据访问一致和存储一致而设计的。数据按key分组在集群上
运行的核心。在水平分区或分片中,key range用于分片,分片跨越多个服务器分配不同的数据.集群的每一台服务器都是数据子集的来源。分布式数据访问的一致性,这使得水平扩展更快。HBase实际上是BigTable存储体系结构的一种实现,BigTable存储体系结构是由Google开发的分布式存储系统,旨在用于管理和扩展非常大的结构化数据。
HBase是面向列族数据存储的简称,他也是面向行的:每行都有用于查找的key(例如, 查找ID 为1234的客户).每个列族组像行内数据(客户地址,订单)一样。将行看作是所有列族中的所有值的链接。
HBase is a column family-oriented database
HBase也是一个分布式数据库。通过key对数据分组是运行在集群上和分片的核心。key充当更新的原子单元。在多台服务器上分配不同的数据分片,每台服务器都是数据子集的来源。
HBase is a distributed database
HBase Data Model
存储在HBase中的数据通过其“rowkey”来定位。这就像关系型数据库中的主键。HBase中的记录根据rowkey排序顺序存储。这是HBase的基本原理,也是HBase架构设计中使用的关键语义。
HBase data model – row keys
Table根据Rowkey的划分行序列的范围,称为region。这些region被分配到被称为RegionServer的数据节点,通过集群中传播region来扩展读写容量,这是自动完成的,也是HBase是水平分割如何设计的。
Tables are split into regions = contiguous keys
下图展示了列族如何映射到存储文件。列族存储在单独的文件中,可以单独访问。
数据存储在HBase表的单元格(cell)中。整个cell包含已添加的结构化信息,叫做Key Value。整个cell,rowkey,column family name(列族名), column name(列名), timestamp(时间戳),and value (值)将存储在您为其设置了值的每个单元格中。Key包含column family name, column name, and timestamp。
逻辑结构上cell以表格格式存储,但是在物理存储上row存储包含所有Key Value信息单元的线性集合。
在下图中,左上展示了数据的逻辑结构,而右下展示了在文件中存储的物理结构。每个Column Family存储在单独隔离的文加中。整个cell,rowkey,column family name(列族名), column name(列名), timestamp(时间戳),and value (值)将存储在您为其设置了值的每个单元格中。
Logical data model vs. physical data storage*
在之前提到过,一个单元格的完整坐标值:Table:Row:Family:Column:Timestamp ➔ Value.HBase表是稀疏表。如果column不存在数据,就不会保存。表的cells使用byte数组进行版本化。可以使用时间戳或者简历自己的版本控制系统。对于每个row:family:column坐标,可以存在多个版本内容。
Sparse data with cell versions
版本是内置的。put操作是一个insert (create)和 一个 update组成,每一个都有自己的版本。delete操作或获取一个墓碑标记,墓碑标记防止数据在查询中被返回。get 会根据参数返回特定的版本。如果不设置任何的参数,将返回最新的版本。您可以配置要保留的版本数量,并按列族完成此项工作。默认保留三个版本。当超过最大版本数量时,额外记录将最终删除。
Versioned data
在这篇博文中,您了解了HBase概要并了解了HBase数据模型。 请继续关注下一篇博文,我将深入探讨HBase架构的细节。 在本系列的第三篇也是最后一篇博客文章中,我们将看看架构设计指南。
说明
MapR-DB部分没有翻
原文地址:HBase and MapR-DB: Designed for Distribution, Scale, and Speed