Hudi Timeline


发布于 2025-06-08 / 2 阅读 / 0 评论 /
Hudi Timeline设计和应用

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
  }