概述
HBase 是海量数据下可以对单条数据快速访问的数据库
特点
- 适合存储PB级别的海量数据,在PB级别的数据以及采用廉价PC存储的情况下,能在几十到百毫秒内返 回数据。处理能力和存储能力都很容易扩展
- HBase本质依然是Key-Value数据库,查询数据功能很简单,不支持join等复杂操作(可通过Hive支持来 实现多表join等复杂操作)
- 根据列族来存储数据的。列族下面可以有非常多的列,列族在 创建表的时候就必须指定。
- HBase中支持的数据类型:byte[](底层所有数据的存储都是字节数组)
- 稀疏:在列族中,你可以指定任意多的列,在列数据为空的情况下,是不会占用 存储空间的
逻辑视图
如何定位到一条数据
table -> rowkey -> column family -> column -> timestamp
rowkey 行键
查询一行数据的主键,RowKey行键可以是任意字符串,最好是16
访问一行数据只有三种方式:
- 通过单个 row key 访问
- 通过 row key 的range
- 全表扫描
存储时,数据按照RowKey的字典序(byte order)排序存储。设计Key时,要充分排序存储这个特性,将 经常一起读取的行存储放到一起。(位置相关性)
column family 列族
HBase表中的每个列,都归属于某个列簇。列簇是表的Schema的一部分(而列不是),必须在创建表的时候指定。
列簇越多,在取一行数据时所要参与IO、搜寻的文件就越多,所以,如果没有必要,不要设置太多的列 簇,官网推荐是小于等于3
column 列键
也称为列名,必须以列族作为前缀,格式为列族:限定词
timestamp 时间戳
HBase 会保存同一份数据的多个版本,版本通过时间戳来管理。
查询时,默认返回最新的数据,如果需要读取 旧版本的数据,可以指定时间戳。
数据也不能无限制的保存历史数据,可以通过下面两种方式删除历史版本的数据:
- 保存数据的最后 n 个版本
- 保存最近一段时间的版本(设置数据的生命周期 TTL)
cell 存储单元格
要定位一个单元,需要满足“行键+列键+时间戳”三个要素。
每个Cell保存着同一份数据的多个版本。
Cell中没有数据类型,完全是字节存储。
使用场景
- 搜索
- 反向索引
概念
Hbase 的架构和原理
HMaster
每台 Region Server 都会与 Master 进行通信,HMaster 的主要任务就是告诉 Region Server 它需要维护哪些 Region,具体功能如下:
-
管理用户对表的增删改查操作
-
管理 Region Server 的负载均衡,动态调整 Region 分布
-
在 Region 分裂后,负责新的 Region 的分配
-
在 Region Server 停机后,负责失效 Region Server 上的 Region 的迁移
宕机后,短时间不会影响读操作
Region
由多个Store组成,HBase使用表存储数据集,当表的大小超过设定的值时, HBase会自动将表划分为不同的Region,它是HBase集群上分布式存储和负载均衡的 最小单位。
Store 分为memstore 和 HFile(StoreFile),memstore写满后(默认 128M),会刷写到磁盘。
RegionServer
由多个Region 组成,在整个集群中可能存在多个节点,每个节点只 能运行一个Region Server,负责对HDFS中读写数据和管理Region和HLog。
WAL 机制
WAL(Write Ahead Log) 预写日志,保证数据操作的原子性和持久性
HBase 通过 HLog 实现 WAL ,每次更新操作都会先写日志到 HLog,服务器宕机后通过 HLog 对数据进行恢复
Zookeeper
-
META 表的位置信息
-
Region Server 故障时,通知 HMaster 进行 Region 迁移
-
HMaster HA
Hbase 的读流程
-
Client 从 zk 获取 META 表的位置信息
-
Client 从某个 Region Server 获取 META 表
-
Client 缓存 META 表在本地,通过 META 表找到 row key 所在的 Region Server
Hbase 的写流程
-
Client put 会将数据先写入 WAL
-
WAL 写入成功后会,再写入到 memstore,成功后返回 ACK
-
Memstore 满后会写入到 HFile
HBase 的 Compaction
在 put 的过程中,会产生大量的 HFile,大量小文件会导致性能问题。通过 Compaction 将多个小 HFile 合并成大 HFile,对过期的数据(超过TTL,被删除,超过最大版本号)进行真正的删除
-
Minor Compaction: 临近的 HFile 合并,会清理 TTL 的数据,但是不会清理被删除的数据
-
Major Compaction: 会将一个 store 下的所有 HFile 进行合并,并且会清理掉过 期的和被删除的数据
单个StoreFile大小超过一定阈值后,触发 Split操作,把当前Region Split成2个Region
Major Compaction 的问题
一般情况下,Major Compaction时间会持续比较长,整个过程会消耗 大量系统资源,对上层业务有比较大的影响。因此,生产环境下通常关闭自动触发 Major Compaction功能,改为手动在业务低峰期触发
Compaction是一个IO密集型操作,必然对读写造成性能影响