

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在 Amazon EMR 上使用 Hudi 的考量與限制
<a name="emr-hudi-considerations"></a>
+ **記錄索引鍵欄位不能為 null 或空白** – 您指定的記錄索引鍵欄位不能有 `null` 或空白值。
+ **結構描述預設在 upsert 和插入時更新** – 提供了一個介面，`HoodieRecordPayload` 確定輸入 DataFrame 和現有 Hudi 資料集如何合併以產生一個新的、更新的資料集。Hudi 提供此類的預設實作 `OverwriteWithLatestAvroPayload`，它會覆寫現有記錄，並更新輸入 DataFrame 中指定的結構描述。若要自訂此邏輯以實作合併和部分更新，您可以使用 `DataSourceWriteOptions.PAYLOAD_CLASS_OPT_KEY` 參數提供 `HoodieRecordPayload` 界面的實作。
+ **刪除需要結構描述** – 刪除時，您必須指定記錄索引鍵、分割區索引鍵，以及預先組合索引鍵欄位。其他欄位可以為 `null` 或空白，但需要完整的結構描述。
+ **MoR 資料表限制** – MoR 資料表不支援儲存點。您可以使用 Spark SQL、Presto 或 Hive 中的讀取優化檢視或即時檢視 (`{{tableName}}_rt`) 查詢 MoR 資料表。使用讀取優化的檢視僅公開基本檔案資料，而不公開基本資料和日誌資料的合併檢視。
+ **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**
  + Presto 不支援在 0.6.0 以下的 Hudi 版本中讀取 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\+/Hudi 0.15\+，建議客戶設定此組態以減少 Kryo 序列化額外負荷：

  ```
  --conf 'spark.kryo.registrator=org.apache.spark.HoodieSparkKryoRegistrar'
  ```
**注意**  
如果您在 EMR Serverless 上使用精細存取控制 (FGAC)，則不需要此組態，因為使用者必須使用 JavaSerializer 而非 KryoSerializer。