Hudi 的工作原理 - Amazon EMR

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Hudi 的工作原理

在亚马逊上使用 Hudi 时EMR,您可以使用 Spark 数据源API或 Hudi DeltaStreamer 实用程序向数据集写入数据。Hudi 将数据集整理到 basepath 下一个分区的目录结构中,类似于传统的 Hive 表。如何将数据布局为这些目录中的文件的具体细节取决于您选择的数据集类型。您可以选择“写入时复制 (CoW)”或“读取时合并 (MOM)”。

无论数据集类型如何,数据集中的每个分区都由其相对于 basepathpartitionpath 唯一标识。在每个分区中,记录分布到多个数据文件中。有关更多信息,请参阅 Apache Hudi 文档中的文件管理

Hudi 中的每个操作都有一个相应的提交,由一个单调递增的时间戳标识,称为 Instant。Hudi 将对数据集执行的一系列操作保留为时间轴。Hudi 依靠此时间轴提供读取器和写入器之间的快照隔离,并支持回滚到前一个时间点。有关 Hudi 记录的操作和操作状态的更多信息,请参阅 Apache Hudi 文档中的 Timeline

了解数据集存储类型:写入时复制与读取时合并

创建 Hudi 数据集时,可以指定数据集在写入时复制或读取时合并。

  • 写入时复制(CoW)– 数据以列状格式存储(Parquet),并且每次更新都会在写入过程中创建一个新版本的文件。CoW 是默认存储类型。

  • 读取时合并(MOR)– 数据使用列式(Parquet)和基于行(Avro)的格式的组合进行存储。更新记录到基于行的增量文件中,并根据需要进行压缩以创建新版本的列式文件。

对于 CoW 数据集,每次更新记录时,包含该记录的文件都会使用更新后的值进行重写。对于 MoR 数据集,每次进行更新时,Hudi 仅写入已更改记录对应的行。MoR 更适合写入或更改繁重而读取量较少的工作负载。CoW 更适合更改频率较低但读取量繁重的工作负载。

Hudi 为访问数据提供三个逻辑视图:

  • 读取优化视图 – 提供来自 CoW 表的最新提交数据集和来自 MOR 表的最新压缩数据集。

  • 增量视图 — 在 CoW 数据集中的两个操作之间提供更改流,以提供下游作业和提取、转换、加载 (ETL) 工作流程。

  • 实时视图 – 通过内联合并列式和基于行的文件,从 MOR 表中提供最新提交的数据。

当您查询读取优化的视图时,查询将返回所有压缩数据,但不包括最新的增量提交。查询此数据可提供良好的读取性能,但忽略最新的数据。当您查询实时视图时,Hudi 会在读取时将压缩的数据与增量提交合并。最新的数据可用于查询,但合并的计算开销使查询性能降低。通过查询压缩数据或实时数据的功能,您可以在查询时在性能和灵活性之间进行选择。

有关在存储类型之间权衡的更多信息,请参阅 Apache Hudi 文档中的存储类型和视图

在 MoR 的 Hive 元数据仓中创建两个表:一个具有您指定的名称的表(即读取优化视图)和一个附加了 _rt 的同名表(即实时视图)。您可以查询这两个表。

将 Hudi 数据集注册到您的元数据仓

当你在 Hive 元存储中注册 Hudi 表时,你可以像使用任何其他表一样使用 Hive、Spark SQL 或 Presto 查询 Hudi 表。此外,你可以将 Hive 和 Spark 配置为使用 AWS Glue 数据目录作为元数据库,从而将 Hudi 与 AWS Glue 集成。对于 MoR 表,Hudi 将数据集注册为元数据仓中的两个表:一个具有您指定的名称的表(即读取优化视图)和一个附加了 _rt 的同名表(即实时视图)。

当您使用 Spark 创建 Hudi 数据集时,您可以通过将 HIVE_SYNC_ENABLED_OPT_KEY 选项设置为 "true" 并提供其它必需的属性来向 Hive 元数据仓注册 Hudi 表。有关更多信息,请参阅使用 Hudi 数据集。此外,您可以使用 hive_sync_tool 命令行实用程序将 Hudi 数据集单独注册为元数据仓中的表。