Hudi的工作原理 - Amazon EMR
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

Hudi的工作原理

使用 Hudi 配 Amazon EMR,您可以使用Spark数据源API或Hudi DeltaStreamer 实用程序。 Hudi 将数据集组织到分区目录结构中, basepath 类似于传统的Hive餐桌。如何将数据布局为这些目录中的文件的具体细节取决于您选择的数据集类型。您可以选择“写入时复制 (CoW)”或“读取时合并 (MOM)”。

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

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

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

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

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

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

有 CoW 数据集,每次对记录进行更新时,包含该记录的文件都会使用更新的值重新写入。含 MoR 数据集,每次有更新时, Hudi 仅写入已更改记录的行。MoR 更适用于读取量较少的写入或变更工作负载。CoW 更适用于不太经常更改的数据上的读取密集型工作负载。

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

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

  • 增量视图 – 提供两个操作之间的变更流 CoW 数据集,以输出下游作业并提取、转换、加载(ETL)工作流。

  • 实时视图 – 提供来自 MoR 表。

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

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

Hudi 在Hive元库中创建两个表 MoR:具有您指定的名称的表,这是一个读取优化的视图,以及带有相同名称的表, _rt,这是实时视图。您可以查询这两个表。

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

当您向 Hive 元数据仓注册 Hudi 表时,您可以像对待任何其他表一样,使用 Hive、Spark SQL 或 Presto 查询 Hudi 表。此外,您可以通过将 Hive 和 Spark 配置为使用 AWS Glue Data Catalog 作为元数据仓来将 Hudi 与 AWS Glue 进行集成。对于 MoR 餐桌、 Hudi 在Metastore中将数据集注册为两个表:具有您指定的名称的表,这是一个读取优化的视图,以及带有相同名称的表, _rt,这是实时视图。

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