

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

# Hudi 的工作原理
<a name="emr-hudi-how-it-works"></a>

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

无论数据集类型如何，数据集中的每个分区都由其相对于 `basepath` 的 `partitionpath` 唯一标识。在每个分区中，记录分布到多个数据文件中。有关更多信息，请参阅 Apache Hudi 文档中的[文件管理](https://hudi.apache.org/docs/concepts#file-management)。

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

## 了解数据集存储类型：写入时复制与读取时合并
<a name="emr-hudi-data-files"></a>

创建 Hudi 数据集时，可以指定数据集在写入时复制或读取时合并。
+ **写入时复制（CoW）**：数据以列状格式存储（Parquet），并且每次更新都会在写入过程中创建一个新版本的文件。CoW 是默认存储类型。
+ **读取时合并（MOR）**：数据使用列式（Parquet）和基于行（Avro）的格式的组合进行存储。更新记录到基于行的*增量*文件中，并根据需要进行压缩以创建新版本的列式文件。

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

Hudi 为访问数据提供三个逻辑视图：
+ **读取优化视图**：提供来自 CoW 表的最新提交数据集和来自 MOR 表的最新压缩数据集。
+ **增量视图**：提供 CoW 数据集中两个操作之间的更改流，以馈送给下游作业和提取、转换、加载（ETL）工作流。
+ **实时视图**：通过内联合并列式和基于行的文件，从 MOR 表中提供最新提交的数据。

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

有关在存储类型之间权衡的更多信息，请参阅 Apache Hudi 文档中的[存储类型和视图](https://hudi.apache.org/docs/concepts.html#storage-types--views)。

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

## 将 Hudi 数据集注册到您的元数据仓
<a name="emr-hudi-hive-metastore"></a>

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

当您使用 Spark 创建 Hudi 数据集时，您可以通过将 `HIVE_SYNC_ENABLED_OPT_KEY` 选项设置为 `"true"` 并提供其它必需的属性来向 Hive 元数据仓注册 Hudi 表。有关更多信息，请参阅[使用 Hudi 数据集](emr-hudi-work-with-dataset.md)。此外，您可以使用 hive\_sync\_tool 命令行实用程序将 Hudi 数据集单独注册为元数据仓中的表。