HBase 的架构相对于其他大数据框架的架构来说是较为复杂的
HBase特点具有:
列式海量储存, 稀疏性, 列数据可为空, 且不占用空间
极易扩展, 储存空间添加 DataNode 节点, 处理性能添加 HRegionServer 节点
高可用, 利用 Zookeeper
高并发
架构中的角色
1. Client
包含了访问 Hbase 的接口,维护对应的 cache 来加速对 Hbase 的访问,例如 cache 的 .META. 元数据信息
2. Zookeeper
HBase 通过 Zookeeper 来做 Hmaster 的高可用、HRegionServer 的监控、元数据的入口以及集群配置的维护等工作
通过 Zoopkeeper 来保证集群中只有1个 Hmaster 在运行,如果 Hmaster 异常,会通过竞争机制产生新的 Hmaster 提供服务
通过 Zoopkeeper 来监控 HRegionServer 的状态,当 HRegionSevrer 有异常的时候,通过回调的形式通知 HMaster HRegionServer上下线的信息
通过 Zoopkeeper 存储元数据的统一入口地址
3. Hmaster
一个集群只有一个 Hmaster
维护集群的元数据信息, 元数据 Hmaster 上保存一份, Zookeeper 保存一份(Hmaster 给的)
为 RegionServer 分配 HRegion
维护整个集群的负载均衡: 当一个 HRegion 过大的时候进行切分, 把一部分交给一个新的 HRegionServer 维护
发现失效的 HRegion,并将失效的 HRegion 分配到正常的 HRegionServer 上
当 HRegionSever 失效的时候,协调对应 HLog 的拆分: 因为元数据存在 Hmaster/ZK 中, 实际的数据和 HLlog 存在 HDFS上, HRegionServer 只起管理作用, 所以挂掉之后数据并无影响, 可以被分配给新的 HRegionServer 管理
4. HRegionServer
一个节点只能有一个 HRegionServer, 也可以说一个 HRegionServer 对应现实中的一台服务器, 就是一个节点
真正"干活"的节点, 直接对接用户的读写请求并处理
管理 Hmaster 为其分配的 HRegion
负责和底层 HDFS 的交互,存储数据到 HDFS
负责 HRegion 变大以后的拆分
负责 HStorefile 的合并: 刷写, 拆分, 合并都是由 Hmaster 借助 ZK 监控, 到一定阈值命令 HRegionServer 进行动作
5. HLog
记录曾删改操作, 与 mysql 中的 binlog 和 Hadoop 中的 edits 类似, 用于系统出现故障后, 数据通过日志进行重建, 一个 HRegionServer 维护一个 HLog
HBase 在读写数据的时候,数据不是直接写进磁盘,而是会在内存中保留一段时间(时间以及数据量阈值可以设定)。在内存中有更高的概率引起数据丢失, 所以有了 HLog.
HLog 会顺序写入到 HDFS 中, 储存的文件夹名为 Write-Ahead logfile, 所以 HLog 也叫做 WAL
6. HRegion
Hbase 表的分片,一个 HRegion 对应一张表, 当表大到一定程度时, 会根据 RowKey 值被切分成不同的 HRegion 存储在 RegionServer 中,在一个 RegionServer 中可以有多个不同的 HRegion, 由于负载均衡分配, 一张表的不同 HRegion 可能被维护在不同的 HRegionServer 上
7. Store
包含 MemStore 和 StoreFile, 一个 Store 对应 HBase 表中的一个列族, 一个列族对应一个或多个 Store: 例如一张有一个列族的大表根据 RowKey 从中间被切分成两个 HRegion, 两个 HRegion 即两个 Store 都包含这个列族
8. MemStore
内存存储, 为了 HBase 的高性能, 对数据的操作不会直接储存在磁盘, 而是储存在磁盘中, 到达一定阈值才会写入磁盘, 为了避免内存数据丢失, 会先写 HLog , 然后再写内存. HRegsionServer 会在内存中存储键值对
9. StoreFile
磁盘上保存原始数据的实际的物理文件,是实际的存储文件
MemStore 中储存的数据达到一定阈值会刷写到磁盘上, 形成 StoreFile
StoreFile Flush 原理: 共有5种条件, 任意一种都会触发 Flush
① Memstore 级别限制:当 HRegion 中任意一个 MemStore 的大小达到了上限(hbase.hregion.memstore.flush.size,默认 128MB),会触发 Memstore 刷新。
② HRegion 级别限制:当 HRegion 中所有 Memstore 的大小总和达到了上限(hbase.hregion.memstore.block.multiplier hbase.hregion.memstore.flush.size,默认 2 * 128M = 256M),会触发 memstore 刷新。
③ HRegionServer 级别限制:当一个 Region Server 中所有 Memstore 的大小总和达到了上限(hbase.regionserver.global.memstore.upperLimit * hbase_heapsize,默认 40% 的 JVM 内存使用量),会触发部分 Memstore 刷新。Flush 顺序是按照 Memstore 由大到小执行,先 Flush Memstore 最大的 Region,再执行次大的,直至总体 Memstore 内存使用量低于阈值(hbase.regionserver.global.memstore.lowerLimit * hbase_heapsize,默认 38% 的 JVM 内存使用量)。
④ 当一个 HRegionServer 中 HLog 数量达到上限(可通过参数 hbase.regionserver.maxlogs 配置)时,系统会选取最早的一个 HLog 对应的一个或多个 Region 进行 flush
⑤ HBase 定期刷新 Memstore:默认周期为 1 小时,确保 Memstore 不会长时间没有持久化。为避免所有的 MemStore 在同一时间都进行 flush 导致的问题,定期的 flush 操作有 20000 左右的随机延时。
10. HFile
是一种储存形式, 例如 parquet 等, StoreFile 是以 HFile 的形式储存在 HDFS 上的
11. HDFS
实际数据储存在 HDFS 中的 block 块中, HDFS 的默认三份备份机制即是 HBase 的备份机制, 故 HBase 不用进行额外备份
HBase的读写流程
https://blog.csdn.net/a30860801/article/details/87074869