HBase简介
HBase是一个分布式的、面向列的开源数据库,该技术的思想来源于Chang et al所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。
就像Bigtable利用了Google文件系统(GFS)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。
HBase是Apache的 Hadoop 项目的子项目。
HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库;另一个不同的是HBase基于列的而不是基于行的模式。
HBase可集群化,可以使用shell、web、api等多种方式访问,适合高读写(insert)的场景,是NoSQL的典型代表产品。
Hbase逻辑模型
以表的形式存放数据
表由行与列组成,每个列属亍某个列族,由行和列确定的存储单元称为元素
每个元素保存了同一份数据的多个版本,由时间戳来标识区分
行键
行键是数据行在表里的唯一标识,并作为检索记录的主键
访问表里的行只有三种方式:
1 通过单个行键访问
2 给定行键的范围访问
3 全表扫描
行键可以是最大长度不超过64KB的任意字符串,并按照字典序存储
对于经常要一起读取的行,要对行键值精心设计,以便它们能放在一起存储
列族与列
列表示为<列族>:<限定符>
Hbase在磁盘上按照列族存储数据,这种列式数据库的设计非常适合于数据分析的情形
列族里的元素最好具有相同的读写方式(例如等长的字符串),以提高性能
时间戳
对应每次数据操作的时间,可由系统自动生成,也可以由用户显式的赋值
Hbase支持两种数据版本回收方式:1 每个数据单元,只存储指定个数的最新版本; 2 保存指定时间长度的版本(例如7天)
常见的客户端时间查询:“某个时刻起的最新数据”或“给我全部版本的数据”
元素由行键、列族:限定符、时间戳唯一决定
元素以字节码形式存放,没有类型之分
HBase物理模型
Region和Region服务器
表在行方向上,按照行键范围划分成若干的Region
每个表最初只有一个region,当记录数增加到超过某个阈值时,开始分裂成两个region
物理上所有数据存放在HDFS,由Region服务器提供region的管理
一台物理节点只能跑一个HRegionServer
一个Hregionserver可以管理多个Region实例
一个Region实例包括Hlog日志和存放数据的Store
Hmaster作为总控节点
Zookeeper负责调度
HLog
用于灾难恢复
预写式日志,记录所有更新操作,操作先记录进日志,数据才会写入
-ROOT- 和 .META. 表
HBase中有两张特殊的Table,-ROOT-和.META.
.META.:记录了用户表的Region信息,.META.可以有多个regoin
-ROOT-:记录了.META.表的Region信息,-ROOT-只有一个region
Zookeeper中记录了-ROOT-表的location
Memstore与Storefile
一个region由多个store组成,每个store包含一个列族的所有数据
Store包括位于内存的memstore和位于硬盘的storefile
写操作先写入memstore,当memstore中的数据量达到某个阈值,HRegionServer会启动flashcache进程写入storefile,每次写入形成单独一个storefile
当storefile文件的数量增长到一定阈值后,系统会进行合并,在合并过程中会进行版本合并和删除工作,形成更大的storefile
当storefile大小超过一定阈值后,会把当前的region分割为两个,并由HMaster分配到相应的region服务器,实现负载均衡
客户端检索数据时,先在memstore找,找不到再找storefile
如果在合并过程中恰好有涉及到有关storefile的查询发生的话,HBase会把小storefile加载到内存中进行合并,在内存中检索相关数据返回给用户。其实就是在内存中做一个独立镜像备份专门提供被查询需求;在另一块内存中进行合并,当合并完成后释放备份的内存空间,返回到原来的状态
HBase的一致性
HBase是CAP中的CP系统,即hbase是强一致性的。对每一个 region 同时只有一台 region server 为它服务,对一个 region 所有的操作请求,都由这一台 region server 来响应。在这台 region server fail,它管理的 region failover 到其他 region server 时,需要根据 WAL log 来 redo,这时候进行 redo 的 region 是 unavailable 的,所以 HBase 降低了可用性,提高了一致性。