HBase
HBase是一个面向列(老师讲的面向列,但是应该不是)的分布式数据库,主要用于存储非结构化和半结构化的数据。
HBase 数据模型
HBase是一个稀疏、多维度、排序的映射表,其索引是行键(Row Key)、列族(Column Family)、列限定符(Column Qualifier)、时间戳(Timestamp)。
例如:
ID(行键) | Version(时间戳) | Info(列族) | |
---|---|---|---|
姓名(列限定符) | 联系方式 | ||
10001 | 2012 | 张三 | 110 |
2015 | 张三 | 114 | |
10002 | 2011 | 李四 | 119 |
2016 | 李四 | 120 |
1.表
利用表来组织数据,由行与列组成,列同时又被分为多个列族。
2.行
表由若干行组成,每个行由行键进行标识,行键(最大64kb,实际运用过程中:10-100字节)按照字典顺序排序。
3.列族
表中的列名以列族作为前缀,每个“列族”都可以有多个列(column),列族是基本的访问控制单元。
4.列限定符
数据在列族中通过列限定符定位,列限定符没有数据类型。
5.单元格
由行、列族和列限定符来确定唯一的一个单元格。单元格中的存储的数据同样没有数据类型,所有的数据都是未解析的字节数组。单元格可以有多个内容,这些内容对应不同的时-间戳,
6.时间戳
每个单元格都可能存在着多个版本的内容,这些不同的版本由时间戳来进行区分。
HBase访问接口
API类型 | 特点 | 适用场合 |
---|---|---|
Native Java API | 最常规和高效的访问方式 | 适合Hadoop MapReduce Job并行批处理HBase表数据 |
HBase Shell | HBase的命令行工具,最简单的接口 | 适合HBase管理使用 |
Thrift Gateway | 利用Thrift序列化技术,支持C++,PHP,Python等多种语言 | 适合其他异构系统在线访问HBase表数据 |
REST Gateway | 解除了语言限制 | 支持REST 风格的Http API访问HBase |
Pig | 可以使用Pig Latin流式编程语言来操作HBase中的数据,和Hive类似,本质最终也是编译成MapReduce Job来处理HBase表数据 | 适合做数据统计 |
Hive | 简单 | 当前Hive的Release版本尚没有加入对HBase的支持,但在下一个版本Hive 0.7.0中将会支持HBase,可以使用类似SQL语言来访问HBase |
存储格式
HBase中的所有数据文件都存储在Hadoop HDFS文件系统上,主要包括两种文件类型:
-
HFile:StoreFile在底层的实现方式,HFile是Hadoop的二进制文件,Hfile数据块常用压缩方式存储。
-
HLog File,HBase中WAL(Write Ahead Log)预写试日志,用来做灾难恢复,是一种Hadoop的Sequence File。
HBase 的功能组件
库函数:链接到每个客户端;
主服务器Master:负责管理和维护表的分区信息;
Region服务器:负责管理和维护分配给自己的Region,处理来自客户端的读写请求;
HBase运行机制
HBase系统架构
- 客户端
- Zookeeper服务器
- Master主服务器
- Region服务器
Zookeeper
帮助协调多台机器组成的集群提供稳定可靠的协同服务。Zookeper中保存了-ROOT-表的地址和Master。
Master服务器
负责表与Region的管理工作。
Region服务器
HBase中最核心的模块,管理和维护分配给自己的Region,响应Client的读写请求。
Region
HBase表中的的数据都是通过行键进行划分维护的,当数据量非常庞大时,就不能将所有的数据都存储在同一机器上,需要将数据分布存储于多台机器之中。所以对需要对行键进行划分区间,一个Region管理一个区间内的数据。Region的默认大小是100M-200M。一个RegionServer又管理多个(10~1000)个Region。
HBase读流程
(1)客户端先从Zookeeper中得到.META表Region的位置,然后再读取.META表的数据。
(2)根据namespace、表名和行键在meta表中找到对应的region信息。(三层定位操作)
(3)找到对应的RegionServer。
(4)查找对应的Region
(5)先从Memstore(缓存)中找数据,如果没有找到,再到StoreFile中去读。
HBase写流程
(1)Client先访问Zookeeper得到meta表Region的位置,然后再读取.META表的数据。
(2)根据namespace、表名和行键在meta表中找到对应的region信息。
(3)找到对应的RegionServer。
(4)Client向RegionServer发出写请求,RegionServer先将操作和数据写入HLog(预写日志),再将数据写入MemStore。当MemStore中的数据丢失、损坏,可以从HLog上恢复。
(5)MemStore达到一个阈值将数据生成为一个StoreFile文件。
(6)当Store中StoreFile的数量超过阈值时,将若干小StoreFile合并(Compact)为一个大StoreFile。
(7) 但是当StoreFile越来越大时,又会触发Split操作,把当前的StoreFile分成2个,相当于把一个Region分成两个Region。