Timeline | Apache Hudi
Hudi维护了在不同时刻在表上执行的所有操作的时间线,这有助于提供表的即时视图,同时也有效地支持按到达顺序检索数据。Hudi的核心是维护表上在不同的即时时间(instants)执行的所有操作的时间轴(timeline),这有助于提供表的即时视图,同时还有效地支持按到达顺序检索数据。一个instant由以下三个部分组成:
- 即时操作:对表格执行的操作类型
- 即时时间:即时时间通常是一个时间戳(例如:20190117010349),它按照动作开始时间的顺序单调增加。
- state:当前状态
Hudi保证在时间线上执行的操作是原子的,并且基于即时时间的时间线是一致的。
执行的关键行动包括
- COMMITS-提交表示将一批记录原子写入表。
- CLEANS-清除表中不再需要的旧版本文件的后台活动。
- DELTA_COMMIT-增量提交是指将一批记录原子写入MergeOnRead类型表,其中一些/所有数据可以直接写入增量日志。
- 压缩-协调Hudi内部差异数据结构的后台活动,例如:将更新从基于行的日志文件移动到列格式。在内部,压缩表现为时间轴上的特殊提交
- ROLLBACK-表示提交/增量提交不成功并回滚,删除在写入过程中生成的任何部分文件
- SAVEPOINT-将某些文件组标记为“已保存”,这样清洁器不会删除它们。它有助于在发生灾难/数据恢复情况时将表恢复到时间线上的某个点。
任何给定的瞬间都可以处于以下状态之一
- REQUESTED-表示已计划但尚未启动的操作;
- INFLIGHT-表示当前正在执行操作;
- COMPLETED-表示时间线上某项操作的完成。
上图中采用时间(小时)作为分区字段,从 10:00 开始陆续产生各种 commits,10:20 来了一条 9:00 的数据,根据event time该数据仍然可以落到 9:00 对应的分区,通过 timeline 直接消费 10:00 (commit time)之后的增量更新(只消费有新 commits 的 group),那么这条延迟的数据仍然可以被消费到。