hbase 刷盘机制_服务器


存储


hbase 刷盘机制_hbase 刷盘机制_02


HBase 主要处理两种文件:一种是预写日志(Write-Ahead Log,WAL),另一种是实际的数据文件。这两种文件主要由 HRegionServer 管理。

一个基本的流程是客户端首先联系 ZooKeeper 子集群(quorum)查找行键,通过 ZooKeeper 获取含有 -ROOT- 的 region 服务器,通过 -ROOT- region 服务器可以查询到含有 .META. 表的 region 服务器,最终,通过查询 .META. 服务器来获取客户端查询的行键数据所在的 region 服务器。

在启动 HBase 时,HMaster 负责将所有 region 分配到 HRegion Server 上,其中也包括特别的 -ROOT- 和 .META. 表。

HRegionServer 负责打开 region,并创建对应的 HRegion 实例。当 HRegion 被打开后,它会为每个表的 HColumnFamily 创建一个 Store 实例,这些列族是用户之前创建表时定义的。每个 Store 实例包含一个或多个 StoreFile 实例,它们是实际数据存储文件 HFile 的轻量级封装。每个 Store 还有其对应的一个 MemStore,一个 HRegionServer 分享了一个 HLog 实例。

写路径

当用户向 HRegionServer 发起 HTable.put(Put) 请求时,其会将请求交给对应的 HRegion 实例来处理。

第一步要决定数据是否需要写到由 HLog 类实现的预写日志中。一旦数据被写入到 WAL 中,数据就会被防到 MemStore 中,同时还会检查 MemStore 是否已经满了,如果满了,就会被请求刷写到磁盘中去。刷写请求由另外一个 HRegionServer 的线程处理,它会把数据写到 HDFS 中的一个新 HFile。

另外,关闭 region 服务器会强制所有的 memstore 被刷写到磁盘。

文件

HBase 使用一个 HDFS 中可配置的根目录,默认设为 "/hbase"。


$HADOOP_HOME/bin/hadoop dfs -lsr /hbase
0 /hbase/.logs
0 /hbase/.logs/foo.internal,60020,1309812147645
0 /hbase/.logs/foo.internal,60020,1309812147645/ 
foo.internal%2C60020%2C1309812147645.1309812151180
0 /hbase/.oldlogs
38 /hbase/hbase.id
3 /hbase/hbase.version
0 /hbase/testtable
487 /hbase/testtable/.tableinfo
0 /hbase/testtable/.tmp
0 /hbase/testtable/1d562c9c4d3b8810b3dbeb21f5746855
0 /hbase/testtable/1d562c9c4d3b8810b3dbeb21f5746855/.oldlogs
124 /hbase/testtable/1d562c9c4d3b8810b3dbeb21f5746855/.oldlogs/ 
hlog.1309812163957
282 /hbase/testtable/1d562c9c4d3b8810b3dbeb21f5746855/.regioninfo
0 /hbase/testtable/1d562c9c4d3b8810b3dbeb21f5746855/.tmp


文件可以被分为两类,一类位于 HBase 根目录下,另一类位于根目录中的表目录下。

根级文件

第一组文件是被 HLog 实例管理的 WAL 文件,这些日志文件被创建在 HBase 的根目录下一个名为 .logs 的目录下。对于每个 HRegionServer,日志目录中都包含一个对应的子目录。在每个子目录中有多个 HLog 文件。一个 region 服务器的所有 region 共享同一组 HLog 文件。

当所有包含的修改都被持久化到存储文件中,从而不需要日志文件时,它们会被防到 HBase 根目录下的 .oldlogs 目录下。在 10 分钟后,旧的日志文件将被 maser 删除。

hbase.id 和 habse.version 文件包含集群的唯一 ID 和文件格式版本信息。

表级文件

在 HBase 中,每张表都有自己的目录,其位于文件系统中 HBase 根目录下。每张表目录包括一个名为 .tableinfo 的顶层文件,其中包括表和列族的定义。.tmp 目录中包含一些临时数据。

region 级文件

region 目录中也有一个 .regioninfo 文件,这个文件包含了对应 region 的 HRegionInfo 实例序列化后的信息。与 .tableinfo 文件类似,它能被外部工具用来查看 region 的相关信息。

region 拆分

一个 region 超过了配置中 region 大小的最大值,region 就需要拆分,其会创建一个对应的 splitis 目录,它被用来临时存放两个字 region 相关的数据。

合并

随着 memstore 的刷写会生成很多磁盘文件。如果文件的数目达到阈值,合并过程将把它们合并成数量更少的体积更大的文件。这个过程持续到这些文件最大的文件超过配置的最大存储文件大小,此时会触发一个 region 拆分。

压缩合并有两种,即 minor 和 major。minor 合并负责重写最后生成的几个文件到一个更大的文件中。major 合并将所有文件压缩成一个单独的文件。在执行压缩检查时,系统自动决定运行哪种合并。

HFile 格式

实际的存储文件功能是由 HFile 类实现的,它被专门创建以达到一个目的:有效地存储 HBase 的数据。


hbase 刷盘机制_hbase 刷盘机制_03


这些文件是可变长度的,唯一固定的块是 FIle Info 块和 Trailer 块。Index 块记录 Data 和 Meta 块的偏移量。每个块都包含一个 magic 头部和一定数量的序列化的 KeyValue 实例。

HBase 存储文件的块与 Hadoop 的块之间没有匹配关系。事实上,这两种块类型之间根本没有相关性。


hbase 刷盘机制_数据_04


KeyValue 格式

本质上,HFile 中的每个 KeyValue 都是一个低级的字节数组,它允许零复制访问数据。


hbase 刷盘机制_数据_05


该结构以两个分布表示键长度(Key Lengh)和值长度(Value Lengh)的定义数字开始。