

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

# 在 Amazon EMR 上使用 Hudi 的注意事项和限制
<a name="emr-hudi-considerations"></a>
+ **记录键字段不能为 Null 或空**：您指定为记录键字段的字段不能具有 `null` 或空值。
+ **默认情况下，架构会在 upsert 和 insert 时更新** — Hudi 提供了一个接口`HoodieRecordPayload`，用于确定如何合并输入 DataFrame 和现有 Hudi 数据集以生成新的、更新的数据集。Hudi 提供了该类的默认实现`OverwriteWithLatestAvroPayload`，它会覆盖现有记录并更新输入中指定的架构。 DataFrame要自定义此逻辑以实现合并和部分更新，您可以使用 `DataSourceWriteOptions.PAYLOAD_CLASS_OPT_KEY` 参数提供 `HoodieRecordPayload` 接口的实现。
+ **删除需要架构**：删除时，必须指定记录键、分区键和预组合键字段。其它列可以成为 `null` 或空，但需要完整的架构。
+ **MoR 表限制**：MoR 表不支持保存点。您可以使用来自 Spark SQL、Presto 或 Hive 的读取优化视图或实时视图（`tableName_rt`）。使用读取优化视图仅公开基本文件数据，不会公开基本数据和日志数据的合并视图。
+ **Hive**
  + 要在 Hive 元数据仓中注册表，Hudi 需要 Hive Thrift 服务器在默认端口 `10000` 上运行。如果使用自定义端口覆盖此端口，请传递 `HIVE_URL_OPT_KEY` 选项，如以下示例所示。

    ```
    .option(DataSourceWriteOptions.HIVE_URL_OPT_KEY, "jdbc:hive2://localhost:override-port-number
    ```
  + Spark 中的 `timestamp` 数据类型在 Hive 中注册为 `long` 数据类型，而不注册为 Hive 的 `timestamp` 类型。
+ **：Presto**
  + 在版本低于 0.6.0 的 Hudi 中，Presto 不支持读取 MoR 实时表。
  + Presto 仅支持快照查询。
  + 要使 Presto 正确解释 Hudi 数据集列，请将 `hive.parquet_use_column_names` 值设置为 `true`。
    + 要设置会话的值，请在 Presto shell 中运行以下命令：

      ```
      set session hive.parquet_use_column_names=true
      ```
    + 要在集群级别设置值，请使用 `presto-connector-hive` 配置分类将 `hive.parquet.use_column_names` 设置为 `true`，如以下示例所示。有关更多信息，请参阅 [配置应用程序](emr-configure-apps.md)。

      ```
      [
        {
          "Classification": "presto-connector-hive",
          "Properties": {
            "hive.parquet.use-column-names": "true"
          }
        }
      ]
      ```
+ **HBase 索引**
  + 用于*构建* Hudi 的 HBase 版本可能与 EMR 发行指南中列出的版本不同。要为 Spark 会话提取正确的依赖项，请运行以下命令。

    ```
    spark-shell \
    --jars /usr/lib/spark/external/lib/spark-avro.jar,/usr/lib/hudi/cli/lib/*.jar \
    --conf "spark.serializer=org.apache.spark.serializer.KryoSerializer" \
    --conf "spark.sql.hive.convertMetastoreParquet=false"
    ```
+ **最佳性能设置**：对于 EMR 7.3\$1/Hudi 0.15\$1，建议客户设置此配置以减少 Kryo 序列化开销：

  ```
  --conf 'spark.kryo.registrator=org.apache.spark.HoodieKryoRegistrar'
  ```
**注意**  
如果您在 EMR Serverless 上使用细粒度访问控制 (FGAC)，则不需要此配置，因为用户必须使用而不是。 JavaSerializer KryoSerializer