HBase概述

HBase数据模型

在BigTable论文中称HBase为 "sparse,distributed,persistent multidimensional sorted map" .   所以由此看来HBase本质看来是一个Map。实际上从逻辑视图来看,HBase中的数据是以表形式进行组织的。与关系型数据库一样,HBase的表也是由行列构成,因此HBase非常容易理解。但是从物理视图来看,HBase是一个Map由键值(KeyValue,KV)构成,不过与普通的Map不同,HBase是一个稀疏的、分布式的、多维排序的Map。

1、逻辑试图

在具体了解逻辑视图之前我们先看一下HBase中的基本概念:

  • table:表,一个表包含多行数据
  • row:行,一行数据包含一个唯一标识 rowkey、多个 column 以及对应的值。在HBase中,一张表中所有的 row 都按照 rowkey 的字典序由小到大排序。
  • column:列,与关系型数据中的列不同,HBase中的 column 由 column family(列簇)以及 qualifier(列名)两部分组成,列簇和列名之间通过 ":" 连接,例如: student :name;其中列簇在创建表的时候要指定,用户不能随意增减。一个column family可以包含很多列,云栖大会上说数百万列
  • timestamp:时间戳梅内个cell在写入HBase的时候都会默认分配一个时间戳作为该cell的版本,HBase支持多版本的存在,即相同的 rowkey、column 可以有多个 value,这些 value 使用 timestamp 作为版本号,版本越大表示数据越新。
  • cell:单元格,由五元组(row、column、timestamp、type、value)组成的结构,其中 type 表示 Put / Delete 这样的操作类型,timestamp 代表这个 cell 的版本。实际在数据库中实际是以KV结构存储的,其中(row、column、timestamp、type)作为K, value作为 V。

下面是BigTable中一张示例表的逻辑视图,表中主要存储网页信息。示例表中包含两行数据,两个 rowkey 分别为 com.cnn.www 和 com.example.www,按照字典序由小到大排列。每行数据有三个列簇,分别为 anchor、contents、perple; 其中列簇 anchor下有两列,分别为 cnnsi.com 以及 my.look.ca,其他两个列簇都只有一列。 可以看出根据行(roekwy) com.cnn.www 和 列 anchor:cnnsi.com 可以定位到数据 CNN,对应的时间戳信息是 t9 。

而同一行的同一列 contents:html 下却有三个版本的数据,版本分别为 t5、t6、t7。

总体来看,HBase的逻辑视图是比较容易理解的,需要注意的是,HBase引入列簇的概念,列簇下的列可以动态扩展;另外,HBase使用时间戳实现了数据的多版本支持。

2、多维稀疏排序Map

上面也提到了HBase是一个稀疏的、分布式的、多维排序的Map

和其他的Map不同在于,HBase中Map的key是一个复合键,由row、column、timestamp、type以及 timestamp 组成;value 就是cell 的值。

栗子:上图中 "com.cnn.www" 以及列 "anchor:cnnsi.com" 对应的数值 "CNN" 实际上在HBase中存储成如下的KV结构

{"com.cnn.www","anchor","cnnsi.com","put","t9"} -> "CNN"

下面来说一下多维、稀疏、排序等关键词:

  • 多维:这个特性比较容易理解。HBase中的Map与普通Map最大的不同在于,key是一个复合数据结构,由多维元素构成,包括rowkey、column family、qualifier、type、timestamp
  • 稀疏:稀疏性是HBase一个比较突出的特点。从上面的逻辑视图可以看出行 "com.example.www" 可以看出,整行数据只有一列 (people:author) 有值,其他列都是空值。在其他数据库中,对于空值的处理都会填充 NULL,对于HBase,如果是空值,则什么都不填充。所以理论上HBase可以无限扩展,因为就算有数百万列,可能很多都是空值,那么HBase空值不填的策略,这就避免了空间的浪费,因此稀疏性是HBase无限扩展的一个重要的条件。
  • 排序:构成HBase的KV在同一个文件夹中都是有序的,但规则并不是仅仅按照 rowkey 排序,而是按照 KV 在同一个文件中都是有序的, 先比较 rowkey,rowkey 小的排在前面;如果 rowkey 相同,再比较 column,即 column family:qualifier ,column 小的排在前面;如果 rowkey 相同,再比较时间戳 timestamp,即比较数据的版本,版本大的排在前面(因为是最新数据),这样的排序方式对提升HBase的读取性能很重要。
  • 分布式:这个比较好理解,构成HBase的所有 Map 并不是集中在某台机器上,而是分布在整个集群中。

3、物理视图

和大多数数据库不同,HBase中的数据是按照列簇存储的,即把数据按照列簇分别存储在不同的目录中。

列簇 anchor 的所有数据存储在一起形成:
列簇 contents 的所有数据存储在一起形成:

列簇 people 的所有数据存储在一起形成:

4、行式存储、列式存储、列簇式存储

存储领域常见的两种存储方式:

  • 行式存储:行式存储系统将一行数据存储在一起,其中一行数据写完之后再去写下一行数据,栗子:MySQL这类的关系型数据库。行式存储在获取一行数据的时候非常高效,但是如果只需要查询读取表中指定的列对应的数据时,,那么行式存储会先取出一行行数据,再在每一行数据中截取待查找目标列。这种处理方式在查找过程中引入了大量的无用列的信息,从而导致大量的内存占用。因此这类系统仅适合处理OLTP类型的负载,对于OLAP这类分析型负载并不擅长。

  • 列式存储:理论上是将一列数据存储在一起,不同的列的数据分别集中存储,最典型的入Kudu、Parquet on HDFS等系统(文件格式),列式存储对于只查找某些列的数据请求非常高效,只需要连续读取所有的待查目标列,然后遍历处理即可,但是列式存储对于获取一行的请求就不那么高效了,需要多次IO读多列数据,最终合并成一行数据,另外,由于同一列数据通常都具有先沟通的数据类型,因此列式存储具有天然的高压缩特性。

  • 列簇式存储:从概念上来看,列簇式存储介于行式存储和列式存储之间,可以通过不同的设计思路在行式存储和列式存储之间相互切换。栗子:一张表只设置了一个列簇,这个列簇包含了所有的列,HBase中一个列簇的数据存储在一起,所以这种设计模式就属于行式存储。如果一张表设置了大量的列簇,一个列簇下只有一列,这显然变成了列式存储,这两种都是极端的表现,当然HBase中不建议设置太多的列簇,但是这种架构为HBase以后演变成HTAP系统提供了最核心的基础。

HBase体系结构

HBase体系结构借鉴了 BigTable 论文,是典型的 Master-Slave 模型。系统中有一个管理集群的 Master 节点以及大量的实际服务用户读写的 RegionServer 节点。HBase中的所有数据最终都是存储在HDFS中的,这个和BigTable实际存储在GFS相对应;系统中还有一个zookeeper节点,协助Master对集群进行管理。

HBase的体系结构:

1、HBase客户端

HBase客户端(Client)提供了 Shell 命令行接口、原生 Java API 编程接口、Thrift / REST API 编程接口以及 MapReduce 编程接口。 HBase 客户端支持所有常见的 DML 操作以及 DDL 操作,即数据的增删改查和表的日常维护等。其中 Thrift / REST API 主要支持非 Java 的上层业务需求,MapReduce 接口主要用于批量导入以及批量数据读取。

HBase客户端访问数据行之前,首先需要通过元数据表定位目标数据所在 RegionServer,之后才会发送请求到该 RegionServer。同时这些元数据会被缓存在客户端本地,以便之后的请求访问。如果集群 RegionServer 发生了宕机或者执行了负载均衡等。从而导致数据分片发生了迁移,客户端需要重新请求最新的元数据并缓存在本地。

2、Zookeeper

Zookeeper也是 Apache Hadoop的一个顶级项目,基于Google 的 Chubby 开源实现,主要用于协调管理分布式应用程序。在HBase系统中,Zookeeper扮演着非常重要的角色。

  • 实现Master高可用:通常情况下系统中只有一个Master工作,一旦Active Master由于异常宕机,Zookeeper会检测到该宕机事件,并通过一定的机制(ZAB)选举出新的 Master ,保证系统的正常运转。
  • 管理系统核心元数据:栗子,管理当前系统中正常工作的 RegionServer 集合,保存系统元数据表 hbase:meta 所在的 RegionServer地址等等。
  • 参与 RegionServer 宕机恢复:Zookeeper 通过心跳可以感知到 RegionServer 是否宕机,并在宕机后通知 Master 进行宕机处理
  • 实现分布式表锁:HBase 中对一张表进行各种管理操作的时候(比如 alter 操作)需要先加表锁,防止其他用户对同一张表进行管理操作,造成表状态不一致。和其他RDBMS表不同,HBase中表通常都是分布式存储,Zookeeper可以通过特定机制实现分布式表锁。

3、Master

Master 主要负责 HBase 系统的各种管理工作:

  • 处理用户的各种管理请求,包括建表、修改表、权限操作、切分表、合并数据分片以及 Compaction 等。
  • 管理集群中所有 RegionServer,包括 RegionServer 中 Region 的负载均衡、RegionSever 的宕机恢复以及 Region 的迁移等等。
  • 清理过期日志以及文件,Master 会每隔一段时间检查 HDFS 中 HLog是否过期、HFile是否已经被删除,并在过期之后将其删除。

4、RegionServer

RegionServer 主要用来响应用的 IO 请求,是HBase中最核心的模块,由 WAL(HLog)、BlockCache以及多个 Region 构成。

  • WAL(HLog):HLog 在HBase中由两个核心的功能-----其一,用于实现数据的高可靠性,HBase数据随机写入时,并非直接写入 HFile 数据文件,而是先写入缓存,再异步刷新落盘。为了防止缓存数据丢失,数据写入缓存之前需要首先顺序写入 HLog,这样就算缓存中的数据丢失,仍然可以通过HLog日志实现主从复制。
  • BlockCache:HBase系统中的读缓存。客户端从磁盘读取数据之后通常会将数据缓存放到系统内存中,后续访问同一数据可以直接从内存中获取而不需要访问磁盘。对于带有大量热点读的业务请求来说,缓存机制会大大的提升性能。BlockCache 缓存对象是一些列 Block 块,一个 Block 默认为 64KB,由物理上相邻的多个KV数据组成。BlockCache 同时利用了空间局部性和时间局部性原理,前者表示最近将读取的KV数据很可能与当前读取的KV数据在地址上相邻的,缓存的单位是Block,而不是单个的KV,就可以实现空间局部性;后者表示一个KV数据正在被访问,那么近期它还可能被访问。当前的BlockCache 主要有两种实现方式:LRUBlockCacge、BuketCace。
  • Region:数据表的一个分片,当数据表大小超过一定阈值就会 "水平切分",分裂为两个Region。Region是集群负载均很的基本单位,通常一张表的 Region 会分布在整个集群的多台RegionServer上,一个RegionServer上会管理多个Region,这些 Region 一般来自不同的数据表。

一个Region 由一个或多个 Store 构成,Store的个数取决于表中列簇的个数,多少个列簇就有多少个Store。HBase中,每个列簇的数据都集中存放在一起形成一个存储单元Store,因此建议将具有相同 IO 特性的数据设置在同一个列簇中。

每个Store由一个 MemStore 和一个或多个 HFile 组成。MemStore称为写缓存,用户写入数据时首先会写道 MemStore,当MemStore写满了之后(默认时128M),系统会异步将数据 flush 成一个HFile 文件。随着数据的不断写入,HFile 文件会越来越多,当 HFile 文件的个数超过了一定阈值之后,系统将会执行 Compact 操作,将这些小文件通过一定策略合并成一个或多个大文件。

5、HDFS

HBase底层依赖HDFS组件存储实际数据,包括用户数据文件、HLog日志文件等最终都会写入HDFS落盘。HDFS是Hadoop生态圈内最成熟的组件之一,数据默认三副本存储策略可以有效保证数据的高可靠性。HBase内部封装了一个名为DFSClient的HDFS客户端组件,负责对HDFS的实际数据进行读写访问。

 

HBase系统的特性

1、HBase的优点

  • 容量巨大:HBase的单表可以支持千亿行,百万列的数据规模,数据容量可以达到TB甚至是PB级。
  • 良好的可扩展性:HBase集群可以非常方便的实现集群容量扩展,主要包括数据存储节点扩展以及读写服务节点扩展,前者增加 DataNode就可以实现,后者通过添加 RgionServer节点来实现扩展。
  • 稀疏性:HBase支持大量稀疏存储,因为HBase在数据为空值的时候是不予存储的,不占用任何空间。
  • 高可用:HBase目前主要擅长于OLTP场景,数据写操作性能强劲,对于随机单点读以及小范围扫描读,其性能也能够得到保证。对于大范围的扫描读可以使用MapReduce提供的API,以便实现更高效的并行扫描。
  • 多版本:hbase中的数据有版本,供用户根据需要选择
  • 支持过期:HBase支持TTL过期特性,用户只需要设置过期时间,超过 TTL 的数据就会被自动的清理,不需要用户写程序手动删除
  • Hadoop原生支持

2、HBase的缺点

  • HBase本身不支持很复杂的聚合运算。
  • HBase本身不支持二级索引功能,所以不支持耳机索引查找,但是有第三方工具例如,Phoenix 就可以支持。
  • HBase原生不支持全局跨行事务,只支持单行事务模型。同样可以使用 Phoenix来提供全局事务模型组件来弥补这个缺陷。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值