Timeline的作用
Hudi维护着一条对Hudi数据集所有操作的不同 Instant组成的 Timeline(时间轴),通过时间轴,用户可以轻易的进行增量查询或基于某个历史时间点的查询,这也是Hudi对外提供基于时间点查询的核心能力之一。
Timeline源码解析
HoodieTimeline类结构
Timeline在Hudi中被定义为 HoodieTimeline接口
Action类型
HoodieTimeline接口定义了针对 Instant的不同操作
String[] VALID_ACTIONS_IN_TIMELINE = {
COMMIT_ACTION,
DELTA_COMMIT_ACTION,
CLEAN_ACTION,
SAVEPOINT_ACTION,
RESTORE_ACTION,
ROLLBACK_ACTION,
COMPACTION_ACTION,
LOG_COMPACTION_ACTION,
REPLACE_COMMIT_ACTION,
CLUSTERING_ACTION,
INDEXING_ACTION
};
操作说明如下
(1)commit:将记录原子写入数据集。
(2)deltacommit :将一批记录原子写入到 MergeOnRead存储类型的数据集(写入增量日志log文件中)。
(3)clean :删除数据集中不再需要的旧版本文件。
(4)rollback :表示当 commit/deltacommit不成功时进行回滚,其会删除在写入过程中产生的部分文件。
(5)savepoint:将某些文件组标记为已保存,以便其不会被删除。在发生灾难需要恢复数据的情况下,它有助于将数据集还原到时间轴上的某个点。
(6)compaction :将基于行的log日志文件转变成列式parquet数据文件。 compaction在时间轴上表现为特殊提交。
(7)restore:将从某个 savepoint恢复。
HoodieInstant
Timeline与 Instant密切相关,每条 Timeline必须包含零或多个 Instant。所有 Instant构成了 Timeline, Instant在Hudi中被定义为 HoodieInstant,其主要包含三个字段
(1)state:状态,如 requested、 inflight、 completed等状态,状态会转变,如当提交完成时会从 inflight状态转变为 completed状态。
(2)action:操作,对数据集执行的操作类型,如 commit、 deltacommit等。
(3)tmiestamp:时间戳,发生的时间戳,Hudi会保证单调递增。
/**
* Instant State.
*/
public enum State {
// Requested State (valid state for Compaction)
REQUESTED,
// Inflight instant
INFLIGHT,
// Committed instant
COMPLETED,
// Invalid instant
NIL
}