1. HBase简介
HBase是什么
建立在Hadoop HDFS之上的分布式面向列的数据库
HBase特点
高可靠,高性能,面向列,可伸缩的分布式存储系统,可横向扩展
优点
- 一致性强,一次写入, 多次读取
- 可自动扩展, 数据过多自动分割
- 高可用, 通过HDFS分布式存储并备份数据, 通过WAL进行数据恢复
- 与MapReduce结合
缺点
- WAL数据恢复速度慢
- 异常恢复效率低
- Major compaction时, I/O操作多,占用资源大,
HBase与HDFS的区别
HDFS | HBase |
---|---|
存储大容量文件的分布式文件系统 | 建立在HDFS上的数据库 |
不支持快速单独记录查询 | 支持在较大表中快速查询 |
高延迟批量处理 | 随机存取,低延迟单行记录访问 |
只能顺序访问 | 存储索引,使用哈希表,快速查找HDFS数据 |
HBase与关系型数据库的区别
HBase | RDBMS |
---|---|
无模式,仅定义列族 | 有模式,描述表结构的约束 |
横向扩展 | 小表,规模小 |
无事务 | 有事务 |
非结构化或结构化数据 | 结构化数据 |
数据反规范化 | 数据有规范化 |
存储机制
HBase是一个面向列的数据库,在表中它由行排序。表模式定义只能列族,也就是键值对。一个表有多个列族以及每一个列族可以有任意数量的列。后续列的值连续地存储在磁盘上。表中的每个单元格值都具有时间戳。
1. 表是行的集合
2. 行是列族的集合
3. 列族是列的集合
4. 列是键值对的集合
2. HBase组件
- ZooKeeper用来协调分布式系统的成员之间共享的状态信息
- Region Server及HMaster也与ZooKeeper连接
- ZooKeeper通过心跳信息为活跃的连接维持相应的ephemeral node
Region server
- 负责数据的读写服务
- 每一个Region server大约可以管理1000个region
- 一个region包含表中所有row key位于region的起始键值和结束键值之间的行
- 组成
组件 | 含义 | 功能 |
---|---|---|
WAL | Write Ahead Log预写式日志,HDFS中存储的文件 | 存储尚未写入永久性存储区中的新数据,数据恢复 |
Block Cache | 读缓存 | 将经常被读的数据存储在内存中,达到阈值溢出被读频率最低的数据 |
MemStore | 写缓存 | 存储从WAL中写入但尚未写入HDFS的数据,写入前排序,每一个region中的每一个column family对应一个MemStore |
Hfiles | HBase文件 | 根据排序号的键存储数据行,位于HDFS上的实际存储文件 |
HBase HMaster
- 负责Region的分配及数据库的创建和删除等操作
- 在集群启动的时候分配region, 根据恢复服务或者负载均衡的需要重新分配region
- 监听zookeeper对于ephemeral node(备份节点)状态的通知
- 提供创建,删除或者更新表格的接口
ZooKeeper
- 负责维护集群的状态, 通过datanode向zookeeper定时发送心跳信息
- 维护服务器是否存活,是否可访问的状态并提供服务器故障/宕机的通知
- 保证良好的一致性及顺利的Master选举
HDFS
- DataNode负责存储所有Region Server所管理的数据
- NameNode负责维护构成文件的所有物理数据块的元数据(metadata)
3. HBase的首次读写
meta table
- 在HBase的default命名空间中默认存在的表,保存集群region的地址信息
- ZooKeeper中会保存META table的位置
- 结构类似于B+树(根节点下左小右大,包含多个叶子节点)
- 键: region的起始键, region id
- 值: Region server
首次读写流程
- 通过zookeeper获得meta table地址
- 通过meta table获得Region server地址
- 通过Region server获得目标row key所在region的Region server地址
- 缓存操作信息
- 与目标Region server通讯, 实现读写
写的一般流程
- 发送put请求
- 顺序写入WAL
- 存入MemStore, 通知客户put完成
4. HBase内置的优化
Read Merge读合并
- HBase中要读取的数据可能会存在于多处
- 已写入的数据位于HDFS上的HFile
- 最近读取的数据位于内存中的Block cache
- 最新的数据位于内存中的MemStore
- HBase遇到这种情况时会自动进行读合并操作,并非真的将数据合并,只是按照顺序寻找数据
- 顺序为: MemStore->Block cache->HFile
Read amplification读放大
- HBase中一个MemStore对应的数据可能会存储于多个HFile中
- 读放大会读取多个HFile影响性能
Minor Compaction小合并
- HBase会自动将多个较小的HFile合并为几个较大的HFile中, 合并过程会经过Merge sort排序
- 目的是提升性能
Major Compaction主合并,Write amplification写放大
- HBase会在规定自动将对应一个列族的所有HFile重新整理合并为一个HFile
- 删除已删除或过期的cell
- 提升读的效率
- 包含大量I/O操作和网络数据通信, 因此也称作写放大
- 该操作会将所需的远程数据下载到本地的Region server上