Timeline
不同时刻对表的所有操作都被 Hudi 维护在一条时间线上,这有助于提供表的瞬时的视图查询,同时还能根据数据的到达顺序支持高校的数据检索服务。Hudi instant 核心概念包含以下几点:
- Instant action (瞬时动作):动作的类型
- Instant time (瞬时时间):是一个时间戳(如:20190117010349),单调递增
- Instant state (瞬时状态):instant 的当前状态
基于 instant time, Hudi 可保证时间线之上的操作是具有原子性和一致性的。
Instant action (瞬时动作)
Hudi Instant action (瞬时动作) 主要有以下几种:
- COMMITS - commit 表明一批数据原子写入到表中
- CLEANS - 后台进程,清理不再需要的旧版本数据
- DELTA_COMMIT - delta commit 表明一批数据原子写入MergeOnRead 类型的表中的 delta logs文件。
- COMPACTION - 后台进程,把行存的数据合并到列存格式文件,是一种特殊的 commit
- ROLLBACK - 表明 commit/delta commit 失败并回滚,删除不完整的文件
- SAVEPOINT - 对文件标记为“saved”,清理程序就不会删除这些文件,在遇到故障或者数据需要修复时,可以把表恢复到时间线的这个保存点
Instant state (瞬时状态)
任何给定的 instant 都有可能是以下的其中一种状态:
- REQUESTED - 表明 Instant action 已在排队中,但还没有初始化
- INFLIGHT - 表明 Instant action 正在执行中
- COMPLETED - 表明 Instant action 上时间线执行完毕
Timeline 的例子
上图的例子展示了10:00至10:20,每5分钟在 Hudi 表的 upsert 操作,时间线有 commit,clean 和 compact。同时还可以观察到 commit time 记录的是数据到达时间(如,10:20AM),而实际是按 event time (事件时间) 从7:00每小时一个分区来组织数据的。到达时间和事件事件是平衡数据延迟及完整性的两个主要概念。
迟到的数据到来(如,事件时间是9:00,在>1小时之后的10:20到达),会根据事件数据写入到对应的分区。在时间线的帮助下,增量查询只需要读取所有在某一瞬间(instant time)以来 commit 成功的变更文件就可以获取到新数据,而不通过扫描所有的文件。