本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
在 Amazon EMR 上使用 Hudi 的注意事项和限制
-
记录键字段不能为 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
,如以下示例所示。有关更多信息,请参阅 配置应用程序。[ { "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