HBase 的外围模块是 Region 服务器。Region 服务器由多个 Region 块形成,Region 块中存储一系列间断的数据集。Region 服务器次要形成局部是 HLog 和 Region 块。HLog 记录该 Region 的操作日志。
Region 对象由多个 Store 组成,每个 Store 对应以后分区中的一个列族,每个 Store 治理一块内存,即 MemStoreo 当 MemStore 中的数据达到肯定条件时会写入 StoreFile 文件中,因而每个 Store 蕴含若干个 StoreFile 文件。StoreFile 文件对应 HDFS 中的 HFile 文件。
HBase 群集数据的形成如图所示。
MemStore
当 Region 服务器收到写申请的时候,Region 服务器会将申请转至相应的 Region。数据先被写入 MemStore,当达到肯定的阈值时,MemStore 中的数据会被刷新到 HFile 中进行长久化存储。
HBase 将最近接管到的数据缓存在 MemStore 中,在长久化到 HDFS 之前实现排序,再程序写入 HDFS,为后续数据的检索进行优化。因为 MemStore 缓存的是最近减少的数据,所以也进步了对近期数据的操作速度。
在长久化写入之前,在内存中对行键或单元格进行优化。例如,当数据的 version 被设为 1 时,对某些列族中的一些数据,MemStore 缓存单元格的最新数据,在写入 HFile 时,仅须要保留一个最新的版本。
Store
Store 是 Region 服务器的外围,存储的是同一个列族下的数据,每个 Store 蕴含一块 MemStore 和 StoreFile(0 个或多个)。StoreFile 是 HBase 中最小的数据存储单元。
数据写入 MemStore 缓存,当 MemStore 缓存满时,内存中的数据会长久化到磁盘中一个 StoreFile 文件中,随着 StoreFile 文件数量的一直减少,数量达到一个阈值后,就会促使文件合并成一个大的 StoreFile 文件。
因为 StoreFile 文件的一直合并,造成 StoreFile 文件的大小超过肯定的阈值,因而,会促使文件进行决裂操作。同时,以后的一个父 Region 会被分成两个子 Region, 父 Region 会下线,新决裂出的两个子 Region 会被 Master 调配到相应的 Regio n 服务器上。
Store 的合并和决裂过程如下图所示。
HFile
将 MemStore 内存中的数据写入 StoreFile 文件中,StoreFile 底层是以 HFile 格局保留的。
HFile 的存储格局如下图所示。
HFile 文件是不定长的,长度固定的只有其中的两块:Trailer 和 File Info。Trailer 中有指针指向其余数据块的起始点,File Info 记录了文件的一些 Meta 信息。每个 Data 块的大小能够在创立一个 Table 的时候通过参数指定(默认块大小为 64KB)。每个 Data 块除了结尾的 Magic 以外就是由一个键值对拼接而成的,Magic 内容是一些随机数字,用于避免数据损坏。
HFile 外面的每个键值对就是一个简略的 Byte 数组。然而这个 Byte 数组外面蕴含了很多项,并且有固定的构造,其具体构造如图所示。大数据培训
键值对构造以两个固定长度的数值开始,别离示意 Key 的长度和 Value 的长度。紧接着是 Key,Key 以 RowLength 开始,是固定长度的数值,示意 RowKey 的长度;接着是 Row,而后是固定长度的数值 ColumnFamilyLength,示意 Family 的长度;之后是 Family 列族,接着是 Qualifier 列标识符,Key 最初以两个固定长度的数值 Time Stamp 和 Key Type(Put/Delete) 完结。Value 局部没有这么简单的构造,就是纯正的二进制数据。
HBase 数据写入流程
客户端拜访 ZooKeeper,从 Meta 表失去写入数据对应的 Region 信息和相应 的 Region 服务器。
客户端拜访相应的 Region 服务器,把数据别离写入 HLog 和 MemStore。MemStore 数据容量无限,当达到一个阈值后,则把数据写入磁盘文件 StoreFile 中,在 HLog 文件中写入一个标记,示意 MemStore 缓存中的数据已被写入 StoreFile 中。如果 MemStore 中的数据失落,则能够从 HLog 上复原。
当多个 StoreFile 文件达到阈值后,会触发 Store.compact() 将多个 StoreFile 文件合并为一个 大文件。
HBase 数据读取流程
客户端先拜访 ZooKeeper,从 Meta 表读取 Region 信息对应的服务器。
客户端向对应 Region 服务器发送读取数据的申请,Region 接管申请后,先从 MemStore 查找数据;如果没有,再到 StoreFile 上读取,而后将数据返回给客户端。