本文内容如下:
HBase 是一个分布式,可扩展,面向列的适合存储海量数据的数据库,其最主要的功能是解决海量数据下的实时随机读写的问题。
通常 HBase 依赖 HDFS 做为底层分布式文件系统,本文以此做前提并展开,详细介绍 HBase 的架构。
- Hbase数据模型
- HBase 关键进程
- HBase 架构
- 读、写流程解读
Hbase数据模型
- RowKey:用于唯一标识Hbase中的一条数据(记录),不可重复,按照字典顺序排序,只能存储64k的字节数据,因此一般要求设计RowKey要简短。
- TimeStamp:HBase自动赋值时间戳(也可自己实现),作为版本号,64位整型。Hbase每个cell存储单元(k:v)对同一份数据有多个版本,通过实践戳来区分版本之间的差异,按时间倒叙排序。
- CF(ColumnFamily):列族,可包含多列。权限控制,存储以及调优都是在列族层面进行的。HBase把同一列族里面的数据存储在同一目录下,由几个文件保存(StoreFile)。
- Column:列,对应key,一列可以在多个版本中维护不同数据。
- Value:数据。
- Cell:是未解析的字节数组。由{rowkey, column(=+),version}唯一确定的单元。由rowkey,列族,列,版本唯一确定一个单元。中的数据,没有类型,全部是字节码形式存储。
HBase 关键进程
HBase是一个 Master/Slave 架构的分布式数据库,内部主要有 Master, RegionServer 两个核心服务,依赖 HDFS 做底层存储,依赖 zookeeper 做一致性等协调工作。
- Master 是一个轻量级进程,负责所有 DDL 操作,负载均衡, region 信息管理,并在宕机恢复中起主导作用。
- RegionServer 管理 HRegion,与客户端点对点通信,负责实时数据的读写。
- zookeeper 做 HMaster 选举,关键信息如 meta-region 地址,replication 进度,Regionserver 地址与端口等存储。
HBase 架构
架构图如下:
组件解读
Client:
- 包含访问HBase的接口并维护catch来加快对Hbase访问。
Zookeeper:
- 保证任何时候,集群中只有一个master;
- 保存所有 Region 的寻址入口;
- 实时监控Region Server的上下线信息,并通知Master;
- 存储HBase的 schema 和 table 元数据。
Master:
- 为 RegionServer 分配 Region ;
- 负责 RegionServer 的负载均衡;
- 发现失效的 RegionServer 并重新分配到其他 RegionServer 工作。(KeepAlive)
- 管理用户对table的增删改查(只负责请求传递)
RegionServer:
- 维护多个 region,处理对这些 region 的 IO请求,真正的增删改查操作。
- 水平切分运行中变得过大的 region (裂变,尽量等分)。
Region:
- 每个 region 保存表中某段连续的数据(多行),每个表一开始只有一个 region,随着数据量不断增加,region增大;
- 当 达到一个阈值时,region就会被 regionServer 水平切分成两个新的 region;
- 当 region 很多时,将会保存到其他 regionServer 上。
Store:
- 一个 region 由多个 store 组成,每一个 store 对应一个CF(列族), store 包含 memstore 和 storeFile;
MemStore:
- 内存缓存区,数据的写操作会先写到 memstore 中,当 memstore 中的数增长到一个阈值后,regionServer 会
启动 flashcatch 进程写入到 storeFile 中,每次写入形成一个单独的 storeFile 。
StoreFile:
- 当storeFile数量增长到一定阈值后,系统会进行合并(minor major compaction),合并过程会进行版本的合并和删除工作,,形成更大的 storeFile。(优化一般主要针对 major 合并)
(注意:过时的版本是在合并时候才删除的,而不是插入数据时) - 当一个 region 所有的 storeFile 大小和数量增长到超过一定阈值后,会把当前 region 分割为两个,并且由 master 分配
到相应的 regionServer 服务器,实现负载均衡; - 客户端检索数据,先在menStore找,找不到再找storeFile。
Hfile:
- 和StoreFile是同一个东西,只不过是站在HDFS角度称这个文件为Hfile,在Hbase角度就叫StoreFile。
HLog:
- 是一个普通的 Hadoop SequenceFile,记录数据以及数据的操作,目的是用来做数据容灾。
- HLog SequenceFile 的 Value 是 HBase 的 KeyValue 对象,对应HFile中的KeyValue。
写流程解读
HBase 数据存储基于 LSM 架构,数据先顺序写入 HLog,默认情况下 RegionServer 只有一个 Hlog 实例,之后再写入 HRegion 的 MemStore 之中。
HRegion 是一张 HBase 表的一块数据连续的区域,数据按照 rowkey 字典序排列,RegionServer 管理这些 HRegion 。
当MemStore达到阈值时触发flush操作,刷写为一个 HFile 文件,众多 HFile 文件会周期性进行 minor compaction 和 major compaction 合并成大文件。
所有 HFile 与日志文件都存储在HDFS之上。
读流程解读
写流程在上面讲述Hbase架构时已有阐述,下面详细介绍读流程。
客户端读取数据有两种方式, Get 与 Scan。
Get 是一种随机点查的方式,根据 rowkey 返回一行数据,也可以在构造 Get 对象的时候传入一个 rowkey 列表,这样一次 RPC 请求可以返回多条数据。
Get 对象可以设置列与 filter,只获取特定 rowkey 下的指定列的数据。
Scan 是范围查询,通过指定 Scan 对象的 startRow 与 endRow 来确定一次扫描的数据范围,获取该区间的所有数据。
一次由客户端发起的完成的读流程,可以分为两个阶段:
- 第一个阶段是客户端如何将请求发送到正确的 RegionServer 上;
- 第二阶段是 RegionServer 如何处理读取请求。
客户端如何发送请求到指定的 RegionServer
HRegion 是管理一张表一块连续数据区间的组件,而表是由多个 HRegion 组成,同时这些 HRegion 会在 RegionServer 上提供读写服务。
所以客户端发送请求到指定的 RegionServer 上就需要知道 HRegion 的元信息,这些元信息保存在 hbase:meta 这张系统表之内,这张表也在某一个 RegionServer 上提供服务,而这个信息至关重要,是所有客户端定位 HRegion 的基础所在,所以这个映射信息是存储在 zookeeper 上面。
客户端获取 HRegion 元信息流程图如下:
以单条 rowkey 的 Get 请求为例,当用户初始化到 zookeeper 的连接之后,并发送一个 Get 请求时,需要先定位这条 rowkey 的 HRegion 地址。
如果该地址不在缓存之中,就需要请求 zookeeper (箭头1),询问 meta 表的地址。
在获取到 meta 表地址之后去读取 meta 表的数据来根据 rowkey 定位到该 rowkey 属于的 HRegion 信息和 RegionServer 的地址(箭头2);
缓存该地址并发 Get 请求点对点发送到对应的 RegionServer(箭头3),至此,客户端定位发送请求的流程走通。
RegionServer 处理读请求
在 RegionServer 端,Get 请求被当做特殊的一次 Scan 请求处理,其 startRow 和 StopRow 是一样的。
这里不详细展开,Hbase使用者只需要知道给定一个 rowkey 可以根据索引结合二分查找可以迅速定位到对应的数据块即可。
详情可参考 :https://www.iteblog.com/archives/2516.html