本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在 Amazon EMR 上使用 Hudi 的考量與限制
-
記錄索引鍵欄位不能為 null 或空白 – 您指定的記錄索引鍵欄位不能有
null
或空白值。 -
結構描述預設在 upsert 和插入時更新 – 提供了一個介面,
HoodieRecordPayload
確定輸入 DataFrame 和現有 Hudi 資料集如何合併以產生一個新的、更新的資料集。Hudi 提供此類的預設實作OverwriteWithLatestAvroPayload
,它會覆寫現有記錄,並更新輸入 DataFrame 中指定的結構描述。若要自訂此邏輯以實作合併和部分更新,您可以使用DataSourceWriteOptions.PAYLOAD_CLASS_OPT_KEY
參數提供HoodieRecordPayload
界面的實作。 -
刪除需要結構描述 – 刪除時,您必須指定記錄索引鍵、分割區索引鍵,以及預先組合索引鍵欄位。其他欄位可以為
null
或空白,但需要完整的結構描述。 -
MoR 資料表限制 – MoR 資料表不支援儲存點。您可以使用 Spark SQL、Presto 或 Hive 中的讀取優化檢視或即時檢視 (
) 查詢 MoR 資料表。使用讀取優化的檢視僅公開基本檔案資料,而不公開基本資料和日誌資料的合併檢視。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
-
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
,如下列範例所示。如需詳細資訊,請參閱設定應用程式。[ { "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.HoodieKryoRegistrar'
注意
如果您在 EMR Serverless 上使用精細存取控制 (FGAC),則不需要此組態,因為使用者必須使用 JavaSerializer 而非 KryoSerializer。