**
物联网架构之HBase
技能目标
- 了解 HBase 体系结构
- 理解 HBase 数据模型
- 掌握 HBase 的安装
- 会使用 HBase Shell 操作 HBase
一、案例概述
**
二、案例前置知识点
**
HBase简介
HBase 是数据库,但并不是传统的关系型数据库,HBase 不使用以行存储的关系型结构存储数据,而是以键值对方式按列存储,由此可以认为它是非关系型数据库 NoSQL(Not Only SQL)中的一个重要代表。
NoSQL目前并没有明确的范围和定义,主要特点是通常用于大规模数据的存储、没有预定义的模式(如表结构)、表和表之间没有复杂的关系。
总体上可将 NoSQL 数据库分为以下四类:
- 基于列存储的类型
- 基于文档存储的类型
- 基于键值对存储的类型
- 基于图形数据存储的类型
通常,人们将 HBase 归为基于列存储类型。在 NoSQL 领域,HBase 本身不是最优秀。但得益于与 Hadoop 的整合,给它带来了更广阔的发展空间。HBase 本质上只有插入操作,更新和删除都是使用插入方式完成,这是由底层 HDFS 流式访问特性(一次写入、多次读取)决定的。所以,在更新时总是插入一个带时间戳的新行,而删除时插入一个带有删除标记的新行。每一次的插入都有一个时间戳标记,每次都是一个新的版本HBase 会保留一定数量的版本(这个值是可以设定的)。如果在查询时提供时间戳,则返回距离该时间最近的版本;否则返回离现在最近的版本。
**
HBase和HDFS的关系
**
HBase体系结构
**
HRegion
HBase 使用表(Table)存储数据集,表由行和列组成,这与关系型数据库类似。但是,当表的大小超过设定值时,HBase 会自动将表划分为不同的区域(Region)。每个区域称为 HRegion,它是 HBase 集群上分布式存储和负载均衡的最小单位,在这点上表和 HRegion 类似于 HDFS 中文件与文件块的概念。一个 HRegion 中保存一个表中一段连续的数据,通过表名和主键范围(开始主键~结束主键)区分每一个HRegion。
一开始,一个表只有一个 Hregion。随着 HRegion 开始变大,直到超出设定的大小阈值,便会在某行的边界上把表分成两个大小基本相同的 HRegion,称为HRegion 分裂。如下图所示
每个 HRegion 由多个 HStore 组成,每个 HStore 对应表中一个列族(ColumnFamily)的存储,列族在后面还会详细介绍。HStore 由两部分组成:MemStore 和StoreFile。用户写入的数据首先放入 MemStore,当 MemStore 满了以后再刷入(flush)StoreFile。StoreFile 是 HBase 中的最小存储单元,底层最终由 HFile 实现,而 HFile是键值对数据的存储格式,实质是 HDFS 的二进制格式文件。HBase 中不能直接更新和删除数据,所有的数据均通过追加的方式进行更新。当StoreFile 的 数 量 超 过 设 定 的 阈 值 将 触 发 合 并 操 作 , 将 多 个 StoreFile 合 并 为 一 个StoreFile,此时进行数据的更新和删除。
**
HRegionServer
HRegionServer 负责响应用户 I/O 请求,向 HDFS 中读写数据,一台机器上只运行一个 HRegionServer。HRegionServer 包含两部分:HLog 部分和 HRegion 部分。其中 HLog 用于存储数据日志,实质是 HDFS 的 Sequence File。到达 HRegion的写操作首先被追加到日志中,然后才被加入内存中的 MemStore。HLog 文件主要用于故障恢复。例如某台 HRegionServer 发生故障,那么它所维护的 HRegion 会被重新分配到新的机器上,新的 HRegionServer 在加载 HRegion 的时候可以通过 HLog对数据进行恢复。
HRegion 部分由多个 HRegion 组成,每个 HRegion 对应了表中的一个分块,并且每一个 HRegion 只会被一个 HRegionServer 管理。
**
HMaster
每台 HRegionServer 都会和 HMaster 服务器通信,HMaster 的主要任务就是告诉每个 HRegionServer 它要维护的 HRegion。
在 HBase 中可以启动多个 HMaster,通过 ZooKeeper 的 Master 选举机制来保证系统中总有一个 Master 在运行。HMaster 的具体功能包括:
- 管理用户对表的增、删、改、查操作;
- 管理 HRegionServer 的负载均衡,调整 HRegion 分布;
- 在 HRegion 分裂后,负责新的 HRegion 分配;
- 在 HRegionServer 停机后,负责失效 HRegionServer 上的 HRegion 迁移。
**
ZooKeeper
ZooKeeper 存储的是 HBase 中的 ROOT 表和 META 表的位置,这是 HBase 中两张特殊的表,称为根数据表(ROOT)和元数据表(META)。META 表记录普通用户表的 HRegion 标识符信息,每个 HRegion 的标识符为:表名+开始主键+唯一 ID。
随着用户表的 HRegion 分裂,META 表的信息也会增长,并且可能还会被分割为几个 HRegion。此时,可以用一个 ROOT 表来保存 META 的 HRegion 信息,而ROOT 表是不能被分割的,也就是 ROOT 表只有一个 HRegion。那么客户端(Client)在访问用户数据前需要首先访问 ZooKeeper,然后访问 ROOT 表,接着访问 META表,最后才能找到用户数据的位置进行访问,如图下所示。
**
HBase与关系型数据库的区别
**
HBase 数据模型
(1)数据模型
在 HBase 中,数据以表的方式存储。具体数据模型中涉及到的术语解释如下:
- 表(Table):是一个稀疏表(不存储值为 NULL 的数据),表的索引是行关键字、列关键字和时间戳。
- 行关键字(Row Key):行的主键,唯一标识一行数据,也称行键。表中的行根据行键进行字典排序,所有对表的访问都要通过表的行键。在创建表时,行键不用、也不能预先定义。而在对表