Apache Hudi特性—Timeline

Apache Hudi(发音为“hoodie”)是下一代流数据湖平台。Apache Hudi直接为数据湖带来了核心数据仓库和数据库功能。Hudi提供表、事务、高效的upserts/delete、高级索引、流吸收服务、数据集群/压缩优化和并发,同时保持数据为开源文件格式。

Apache Hudi不仅非常适合流式工作负载,还允许创建高效的增量批处理管道。Apache Hudi可以轻松地在任何云存储平台上使用。Hudi的高级性能优化,使任何流行的查询引擎(包括Apache Spark、Flink、Presto、Trino、Hive等)的分析工作负载更快。

下面将讨论一些关键概念和术语,这些概念和术语对于理解和有效使用这些原语非常重要。

Hudi Timeline

Apache Hudi使用Timeline来管理事务和其他表服务。

Hudi的核心是维护表上在不同时间instant(瞬态)执行的所有操作的timeline(时间线),这有助于提供表的瞬时视图,同时还有效地支持按到达顺序检索数据。一个Hudi instant(瞬态)包括以下组成部分:

  • (1) Instant action:对表执行的操作类型。
  • (2) Instant time:瞬态时间,通常是一个时间戳(例如:20190117010349),它按照action的开始时间顺序单调地增加。
  • (3) state:瞬态的当前状态。

Hudi保证在时间轴上执行的操作是原子的、基于瞬态时间的时间轴一致的。执行的关键操作包括:

  • (1) COMMITS:一个commit 表示将一批记录原子地写到一个表中。
  • (2) CLEANS:清除表中不再需要的旧版本文件的后台活动。
  • (3) DELTA_COMMIT:增量提交指的是将一批记录原子地写入MergeOnRead类型表,其中部分/所有数据都可以写入增量日志。
  • (4) COMPACTION:协调Hudi内部不同数据结构的后台活动,例如:将更新从基于行的日志文件移动到柱状格式。在内部,compaction显示为时间轴上的一个特殊提交。
  • (5) ROLLBACK:表示提交/增量提交不成功&回滚,删除写入过程中产生的所有部分文件。
  • (6) SAVEPOINT:将某些文件组标记为“已保存”,这样cleaner就不会删除它们。在灾难/数据恢复场景中,它有助于将表恢复到时间轴上的某个点。

任何给定的瞬态(instant)都可能处于下列状态之一:

  • (1) REQUESTED:表示某个action已安排,但尚未启动。
  • (2) INFLIGHT:表示当前正在执行的action。
  • (3) COMPLETED:表示时间轴上action的完成。

例如,下面的例子显示了10:00到10:20之间发生在Hudi表上的upserts事件,大约每5分钟发生一次,在Hudi时间轴上留下提交元数据,以及其他后台清理/压缩,如下图所示。

请注意,提交时间表示数据到达的时间(10:20AM),而实际的数据组织反映的是实际时间或事件时间,这些数据是为(从07:00开始的每小时存储桶)准备的。在考虑延迟和数据完整性之间的权衡时,这是两个关键的概念。

当有延迟到达的数据时(预计9:00到达的数据,在10:20到达,迟到超过了1个小时),可以看到upsert将新数据生成到更旧的时间桶/文件夹中。在时间轴的帮助下,尝试获取10:00以后成功提交的所有新数据的增量查询能够非常有效地只使用更改的文件,而不必扫描所有超过07:00的时间桶。


《Spark原理深入与编程实战》