HBase属于列式非关系型娄据库(NoSQL),在介绍HBse则先了解NoSQL。

一、关于NoSQL
什么是NoSQL?
NoSQL(Not Only SQL),它是一个通用的述语,也就是非关系型数据库,它并不是以sql作为它的主要访问语言。
现在有比较多的NoSQL数据库,BerkeleyDB是一个本地NoSQL数据库;HBase是一个分布式数据库(从技术上说它是一个数据存储而不是数据库)
NoSQL产生的主要背景
随着互联网的发展,传统的关系型数据库在应付超大规模和高并发的系统上已经“力不从心”,而非关系型数据库则在这一方面有优势。
NoSQL数据库的分类
-
键值(Key-Value)存储数据库
它是以键值对的格式进行存储的,类似于Java中的Map,在数据库中有一个特定的key键和键所指向的value值。
优势:简单且易于部署,可以把程序中的数据直接映射到数据库中,使得程序中的数据和数据库中的数据存储方式很相近。如:Redis
-
列存储数据库
传统的关系型数据库是按行进行存储的,而列数据库则是每一列单独存储。
优势:仅仅查询所需要的列,可以大大提高查询的速度。如:HBase
-
文档型数据库
这种类型数据库与键值存储类似,这个类型的数据模型是把内容按照某些特定的格式进行存储(如:JSON格式)。如:MongoDB
-
图形数据库
它与关系型数据库和列式数据库不同,它是基于灵活的图型模型,并且可以扩展到多个服务器上
NoSQL数据库的应用
主要应用于如下场景:
-
数据量大、数据模型比较简单
-
对数据库的性能要求比较高,需要节省开发及维护成本
-
不需要高度的数据一致性
-
对于给定的吸,比较容易映射复杂值的环境,数据之间关系性不强
关系型数据库与非关系型数据库的区别
对比项
|
关系型数据库
|
非关系型数据库
|
成本
|
相对非关系型数据库可能存在软件购买费用
|
易于部署
基本是开源软件
|
查询速度
|
查询速度慢(存储于硬盘中)
|
查询速度快(存储于缓存中)
|
数据格式
|
基础类型
|
key-value形式、文档形式、图形形式……
可以存储基础类型、对象、集合……
|
扩展性
|
有类似join这样的多表查询机制限制,扩展难
|
扩展相对容易
|
二、HBse简单介绍
HDFS是大型数据集分析处理的文件系统,具有高延迟的特点,它倾向于读取整个数据集而不是指定的某个记录,因而在处理低延的用户请求时,HBase则为更好的选择,它可以实现某条数据的快速定位,提供实时的读写功能。
HBase:HadoopDataBase,一个基于HDFS和Zookeeper的列式数据库。是一个高可靠、高性能、面向列、可伸缩、实时读写的分布式数据库。

HBase利用HDFS作为它的文件存储系统;利用基于YARN的MapReduce处理HBase的海量数据;利用Zookeeper作为其分布式协同服务。
它主要用来存储非结构化和半结构化的松散数据
注意:并不是所有的情况都适用于HBase。
-
当数据量达到数亿或数十亿则是一个好的选择,原因是当数据量不大时,所有的数据可能在HBase的单个节点上,而其它的集群则可能处于空闲的状态。
-
HBase并没有RDBMS所提供的索引、事务、高级查询语言等功能,不可以把RDBMS构建的应用直接移植到HBase上
HBase的数据模型
HBase的数据模型主要包含:行键、列族、时间戳、单元格、HLog(WAL log)
-
行键(Row Key)
行键是一个字节数组,任何的字符串都可以作为行键,注意:行键只可以存储64KB的字节数据。要对表进行访问,需要通过行键进行。
-
列族/列标签
HBase中的每个列都是归属于某个列族的,列表则以列族作为前缀,每个列族都可以有多个列成员,通过列标签来表示,新的列族成员可以动态增加。HBase中会把同一列族里面的数据存储在同一目录下,在几个文件中保存。
-
时间戳
HBase中的每个cell存储单元,会以同一份数据存储多个版本,HBase引入时间戳区分每个版本之间的差异,时间戳的类型是64位整数,不同版本的数据根据时间戳倒序排序。时间戳可以在HBase写入数据时自己动赋值也可以由客户指定显示赋值。
-
单元格
它的内容是没有解析的字节数组。由行和列坐标交叉决定,同时单元格是有版本的,数据没有数据类型的都是由二进制字节码形式存储。
HBase体系架构及组件
如下图为HBase的体系架构图

-
Zookeeper
这个组件主要用来存储HBase的Schema和Table元数据,它可以保障在任何时间,集群中只有一个Master。同时来存储所有Region的寻址入口,进行实时监控RegionServer的上线和下线信息,并且实时通知HMaster
-
HMaster
它类似于HDFS中的NameNode,它的主要作用是为RegionServer分配Region,同时负责RegionServer的负载均衡。它也会管理用户对Table的增、删、改操作
-
HRegionServer
它类似于HDFS中的DataNode,它负责维护Region,处理对Region的I/O请求。同时会负责切分在运行过程中变得过大的Region
-
Client
它包含了访问HBase的接口,同时维护Cache来加快对HBase的访问性能。
-
Region
Region是HBase中分布式存储和负载均衡的最小单元。HBase会自动把表水平切分为多个区域,也就是多个Region,每一个Region会保存一个表里某段连续的数据。每个表一开始只有一个Region,当数据越来越多从而达到一个阀值的时候,这个Region会等分成两个Region(这个过程也称为裂变)
-
MemStore和StoreFile
一个Region会由多个Store组成,一个Store包含内存中的MemStore和磁盘StoreFile
HBase的执行原理

从上面的图可以看到,一个Table包含了多个Region,每一个Region又包含了多个Store,同时每个Store又由一个MemStore和0至多个StoreFile组成。
StoreFile是以HFile的格式保存在HDFS上的
写入操作的执行
-
把数据写入到MemStore中
-
当MemStroe中的数据达到一定的阀值时,HRegionServer启动FlashCache进程写入StoreFile,每次写入会形成一个单独的StoreFile
-
当StoreFile文件数量达到一定阀值时,系统会进行合并,在合并过程中会进行版本合并和删除工作,形成更大的StoreFile
-
当一个Region中所有的StoreFile大小之和超过一定阀值时,会把当前的Region分割为两个,并由HMaster分配到相应的RegionServer服务器上,以实现负载均衡
查找数据
会先从MemStroe中查找,如果从MemStore中找不到数据,会再从StoreFile上查找