写点什么

浅析 Region split 引入 HFileLink 优化子 Region 操作实现原理

  • 2022 年 7 月 08 日
  • 本文字数:2724 字

    阅读完需:约 9 分钟

Region Split 使用 HFileLink 代替 reference 生成子 Region,能优化子 Region 读数据、二次分裂和 Compaction 操作,本文对该优化实现原理进行剖析,文章作者为中国移动云能力中心大数据团队软件开发工程师李天梅。

一、Region Split

Region Split 介绍

HBase Region 执行分裂操作,在.split 文件夹下新建两个子文件夹,称之为 daughter A、daughter B,并在文件夹中生成 reference 文件,分别指向父 Region 中对应文件。reference 文件名形式:父 Region 对应 HFile.父 Region。reference 文件是一个引用文件,由两部分构成:其一是分裂点 splitKey,其二是一个 boolean 类型的变量(true 或 false),true 表示该 regerence 文件引用的是父文件的上半部分(top),false 表示引用的是下半部分(bottom)。

父 Region 分裂为两个子 Region 后,将 daughterA、daughterB 拷贝到根目录下,形成两个新的 Region;父 Region 通知修改 hbase.meta 表后下线,不再提供服务。下线后 parent region 在 meta 表中的信息并不会马上删除,而是标注 split 列、offline 列为 true,并记录两个子 region;开启 daughter A、daughter B 两个子 region,通知修改 hbase.meta 表,正式对外提供服务。父 Region 与两个子 Region 的组成如下:



存在 reference 的子 Region 操作问题

读操作问题

HBase Region Split 过程中没有涉及数据移动,分裂后的子 Region 文件实际没有任何数据,文件中存储的仅是一些元数据信息。相较于父 Region 执行读操作,子 Region 执行读操作,增加了解析 reference 文件名定位引用 HFile 位置以及读取 reference 文件内容定位确定引用 HFile 范围的操作,具体流程如下图。新增的操作会影响读操作的性能。



1.根据 reference 文件名(region 名+真实文件名)定位到真实数据所在文件路径;2.根据 Reference 文件内容中记录的两个重要字段确定实际扫描范围。top 字段表示扫描范围是 HFile 上半部分还是下半部分。如果 top 为 true,表示扫描的是上半部分,结合 splitkey 字段可以明确扫描范围为 [firstkey,splitkey) ;如果 top 为 false,表示扫描的是下半部分,结合 splitkey 字段可以明确扫描范围为 [splitkey,endkey)。

Compaction 问题

HBase Compaction 是从一个 region 的一个 Store 中选择部分 HFile 文件进行合并。合并原理是,先从这些待合并的数据文件中依次读出 KeyValue,再由小到大排序后写入一个新文件。

子 Region Compaction 相较于父 Region Compaction,同样增加了 reference 名解析和 reference 内容读取过程,增大 Region Compaction IO。子 Region Compaction 的文件组成如下:



二次分裂问题

Region Split 分裂生成的子 Region 仅仅使用 Reference File 存储元数据信息,不包含任何数据。如果子 Region 没有执行 Compaction 操作,则子 Region 目录下是由 reference 文件组成,对其执行二次分裂操作,实际是对 region 下的 reference 执行分裂操作,但是 reference 文件是对 HFile 文件的部分引用,不能进行分裂,所以存在 reference 文件的子 Region 不能执行二次分裂操作。

二、HFileLink 介绍

HFileLink 是一个描述到另一个 Table/Region 的 HFile 的链接,这个链接是一个名称形式为 table=region-info 的空文件。HFile 的存储位置是在 HBase Region 目录或 HFile 的归档目录 rootDir/.archive/下,HBase 通过 HFileLink 文件名解析链接的 HFile 所属表、region 以及 HFile 名称,从而定位链接的 HFile 位置。HFileLink 定位链接的 HFile 的流程如下:



三、Region split 使用 HFileLink 替换 reference

Region split 寻找到分裂点之后,开始执行真正的 region split 操作。在对 Region 下的每个 HFile 进行分裂过程中,判断 HFile 中是否包含分裂点,如果包含分裂点,则生成两个指向该 HFile 的 Reference File 文件到子 Region 下,如果不包含分裂点,则生成一个链接该 HFile 的 HFileLink File 到子 Region 下。HFileLink 替换 reference 文件生成的子 Region 组成如下:



四、存在 HFileLink 的子 Region 操作优化

HFileLink 链接的是整个 HFile 文件,reference 引用的是 HFile 文件的一部分。Region split 使用 HFileLink 代替 reference,能优化其生成的子 Region 的读、二次分裂和 Compaction 操作。

读操作优化

HBase Region 分裂没有涉及到数据移动,子 Region 的文件没有任何用户数据,执行读操作,如果是 reference 文件,则按照 1.2.1 节介绍方式读取数据,如果是 HFileLink 文件,仅仅通过 HFileLink 的文件名即可快速定位 HFile 所在位置,并执行读操作,HFileLlink 定位 HFile 的流程如下:



Region split 使用 HFileLink 代替 reference,执行读操作时,仅需要通过 HFileLink 文件名实现快速定位 HFile 位置,并执行读操作,相比与从 reference 读数据,省略了读取文件内容定位引用 HFile 的范围,能提高子 Region 读操作的性能。

Compaction 优化

使用 HFileLink 替换 reference 的 Region split 与 Stripe Compaction 结合,可以实现轻量级的 Compaction,能大大节省 Compaction IO。

Stripe Compaction 思想

Stripe store file engine 存储文件,Region 的 rowkey 的 rowkey 被切分形成 stripes,例如 [1FFF,2FFF),切分成 [1FFF,24FF),[24FF,2FFF) 两个区间,每个区间成为 Stripe。Region 下的数据文件分为 Level-0 和 Level-1 两层。其中 Level-0 主要用来存储临时的数据文件(例如使用 bulkload 或者执行 mem flush 操作之后的数据), Level-1 层的数据是按照 Stripe 的分区来区分。Compaction 是 Level-0 上升到 Level-1 的过程,同时,在 Level-1 层的数据,也会进行相关的合并。Region 形式如下:



轻量级 Compaction

Stripe store file engine 获取 Region splitKey,倾向于返回 stripe 的 endRowKey,因此,执行 Region Split 操作,子 Region 的 Level-0 层的文件由 reference 组成, Level-1 层文件由 HFileLink 组成。执行 Compaction 操作,Level-0 层需要读取 reference 文件内容,确定读取的 HFile 范围,从 HFile 读 Key-Value 写入到新的 HFile,但是 Level-1 层仅需要移动 HFileLink 链接的 HFile 即可,不需要 Compaction IO,从而使 Compaction 变成轻量级操作。具体操作流程如下图所示:



二次分裂优化

由于 HFileLink 链接的是整个 HFile,对其执行分裂操作,实际上是对整个 HFile 执行分裂操作,而 HFile 是可以执行分裂操作,故 HFileLink 文件是可以执行分裂操作。子 Region 中如果只存在 HFile 和 HFileLink 文件,是可以执行二次分裂操作。

五、总结

Region Split 使用 HFileLink 代替 reference,能优化子 Region 读数据、分裂和压缩操作,但是在具体应用之前,还需要对子 Region 操作优化的性能需要进一步测试。

用户头像

移动云,5G时代你身边的智慧云 2019.02.13 加入

移动云大数据产品团队,在移动云上提供云原生大数据分析LakeHouse,消息队列Kafka/Pulsar,云数据库HBase,弹性MapReduce,数据集成与治理等PaaS服务。 微信公众号:人人都学大数据

评论

发布
暂无评论
浅析 Region split 引入 HFileLink 优化子 Region 操作实现原理_HBase_移动云大数据_InfoQ写作社区