一、概述

Hoodie ArchivedTimeline 管理已归档的 Instant,可以方便地回湖之前的数据版本。通 HoodieArchivedTimeline,用户可以轻松地管理和查询)日档数据的元数据,以及对归档数据进行基于时间的查询和版本控制。

二、设计

随着Hudi表不断写入,Instant会逐渐增多,为了降低 ActiveTimeline 上文件压力,需要对比较久远的 Instant 进行归档,并将这些 Instant 从 ActiveTimeline 移除。这个操作一般是默认执行的 (hoodie.archive.automatic 默认为 true),归档后的 Instant 就会维护在 HoodieArchivedTimeline 中,位于 /path/to/table/.hoodie/archived 目录下。

https://blog.csdn.net/czmacd/article/details/126891750

三、实现

https://cloud.tencent.com/developer/article/1812231?from=15425&areaSource=102001.2&traceld=_5VsewYPjszSuGYpkyZgL

在每次 commit 时会调用 $HoodieCommitArchiveLog.archiveIfRequired$ 来判断是否需要进行归档,其核心代码如下

其中需要通过 $getInstantsToArchive$ 获取需要归档的 Instant,然后在进行归档,接着再将 Instant 删除。

3.1. 方法

3.1.1. 获取 Instant

通过 $HoodieTimelineArchiver.getInstantsToArchive$ 来获取待归档的所有 Instant,其核心代码如下:

在获取待处理的 instant 时,会先根据配置项读取最大/最小需要保留的 commit,接着单独处理 clean类型的 instant,之后根据最早的 savepoint和处于 pending的 compaction来过滤出需要被处理的 instant(时间小于最早的 savepoint并且也小于最早的 compaction),然后与 clean类型的 instant合并,最后返回待处理的所有 instant。

3.1.2. 归档 Instant

在获取所有待归档的 Instant 后,便调用 $HoodieCommitArchiveLog.archive$ 开始归档,其核心代码如下

写入文件流程非常简单,即将集合放入 Block块中,然后再写入文档文件中(与写入日志文件类似)

3.1.3. 删除 Instant

在归档完后,需要调用 $HoodieCommitArchiveLog.deleteArchivedInstants$ 方法来删除 Timeline 中的已归档的 instant,其核心代码如下

可以看到删除 instant 的主要逻辑就是删除其对应的文件(包括元数据目录和aux目录)。