image.png概括

Apache Hudi(发音为“hoodie”)是下一代流数据湖平台。Apache Hudi将数据仓库和数据库功能直接引入数据湖。Hudi提供了表、事务、高效的upserts/delete、高级索引、流摄取服务、数据集群/压缩优化和并发,同时保持数据的开源文件格式(Avro,Parquet)。目前Uber,亚马逊,字节跳动正在使用他们来构建数据湖。兼容卡元组件Apache Spark, Flink, Presto, Trino, Hive等

时间轴Timeline

hudi 维护了一个不同时刻(instants)对于数据集不通操作的一个时间轴(timeline)
Instant action 操作类型

  • COMMITS - 一次提交表示将一组记录原子写入到数据集中。
  • CLEANS - 删除数据集中不再需要的旧文件版本的后台活动。
  • DELTA_COMMIT - 增量提交是指将一批记录原子写入到MergeOnRead存储类型的数据集中,其中一些/所有数据都可以只写到增量日志中。
  • COMPACTION - 协调Hudi中差异数据结构的后台活动,例如:将更新从基于行的日志文件变成列格式。在内部,压缩表现为时间轴上的特殊提交。
  • ROLLBACK - 表示提交/增量提交不成功且已回滚,删除在写入过程中产生的所有部分文件。
  • SAVEPOINT - 将某些文件组标记为”已保存”,以便清理程序不会将其删除。在发生灾难/数据恢复的情况下,它有助于将数据集还原到时间轴上的某个点。

Instant time 操作时间:时间的开始时间,单调递增的时间戳
state 当前的状态

  • requested - 表示已调度但尚未启动的操作。
  • inflight - 表示当前正在执行该操作。
  • completed - 表示在时间轴上完成了该操作。



Hudi保证在时间轴上的操作是原子性的并且instants和timeline的时间的一致性

文件结构

Hudi将表组织成hdfs上的目录结构和hive类似,在每个分区内,文件被组织为文件组,由文件id唯一标识。 每个文件组包含多个文件切片,其中每个切片包含在某个提交/压缩即时时间生成的基本列文件(.parquet)以及一组日志文件(.log*),该文件包含自生成基本文件以来对基本文件的插入/更新。 Hudi采用MVCC设计,其中压缩操作将日志和基本文件合并以产生新的文件片,而清理操作则将未使用的/较旧的文件片删除以回收DFS上的空间。

表类型和查询方式

表类型决定如何索引数据和如果写入数据
查询类型决定支持的查询类型

Table Type Supported Query types
Copy On Write Snapshot Queries + Incremental Queries
Merge On Read Snapshot Queries + Incremental Queries + Read Optimized Queries

COW(写时复制):仅使用Parquet存储,在写入时完成数据的合并和更新版本并重写进文件
MOR(读时合并):使用Parquet+Avro方式存储,更新记录到增量文件中,通过同步或者异步的方式合并数据
image.png
Snapshot Queries:查询操作将查询最新快照的表数据。如果是Merge on Read类型的表,它将动态合并最新文件版本的基本数据和增量数据用于显示查询。如果是Copy On Write类型的表,它直接查询parquet表,同时提供upsert/delete操作
Incremental Queries:查询只能看到写入表的新数据。这有效的提供了change streams来启用增量数据管道
Read Optimized Queries:查询将查看给定提交/压缩操作表的最新快照

Trade-off Snapshot Read Optimized
Data Latency Lower Higher
Query Latency Higher (merge base / columnar file + row based delta / log files) Lower (raw base / columnar file performance)

查询方式

image.png

  1. https://github.com/apache/hudi/tree/release-0.11.0
  2. mvn clean install -DskipTests -Dscala-2.11 -T 4
  3. mvn clean install -DskipTests -Drat.skip=true -Pflink-bundle-shade-hive2