文章目录
- 时间轴(TimeLine)
时间轴(TimeLine)
就是一个时间线,它的每一个操作都记录在内,每一个时刻,你做了什么事情,对某一个时刻,记录一个时刻的数据
Hudi 的核心是维护表上在不同的即时时间(instants)执行的所有操作的时间轴(timeline),这有助于提供表的即时视图,同时还有效地支持按到达顺序检索数据。一个instant 由以下三个部分组成:action(动作),time(时间),State(状态)
1)Instant action:在表上执行的操作类型
- COMMITS:一次 commit 表示将一批数据原子性地写入一个表。
- CLEANS:清除表中不再需要的旧版本文件的后台活动。
- DELTA_COMMIT:增量提交指的是将一批数据原子性地写入一个 MergeOnRead 类型的表,其中部分或所有数据可以写入增量日志。
- COMPACTION:合并 Hudi 内部差异数据结构的后台活动,例如:将更新操作从基于行的 log 日志文件合并到列式存储的数据文件。在内部,COMPACTION 体现为timeline 上的特殊提交。每一次增量提交都会写到一个log文件中,将数据都合并到一起。
- ROLLBACK:表示当 commit/delta_commit 不成功时进行回滚,其会删除在写入过程中产生的部分文件。
- SAVEPOINT:将某些文件组标记为已保存,以便其不会被删除。在发生灾难需要恢复数据的情况下,它有助于将数据集还原到时间轴上的某个点。
2)Instant time
通常是一个时间戳(例如:20190117010349),它按照动作开始时间的顺序单调增加。
3)State
- REQUESTED:表示某个 action 已经调度,但尚未执行。
- INFLIGHT:表示 action 当前正在执行。
- COMPLETED:表示 timeline 上的 action 已经完成。
4)两个时间概念
区分两个重要的时间概念:
- Arrival time: 数据到达 Hudi 的时间,commit time。(摄入时间)
- Event time: record 中记录的时间。(事件时间)
上图中采用时间(小时)作为分区字段,从 10:00 开始陆续产生各种 commits,10:20 来了一条 9:00 的数据,根据 event time 该数据仍然可以落到 9:00 对应的分区,通过timeline 直接消费 10:00 (commit time)之后的增量更新(只消费有新 commits 的 group),那么这条延迟的数据仍然可以被消费到。