Hudi性能调优
更新时间 2026-10-12 11:42:27
最近更新时间: 2026-10-12 11:42:27
本章节介绍Hudi性能调优建议。
表类型选择
1、离线批量 ETL、读多写少场景选择 COW,查询性能最优;
2、频繁更新的维度表、近实时写入场景选择 MOR,配合压缩策略控制读放大;
3、表类型建表后不可更改,需在建表前结合读写比权衡。
写入并行度
写入并行度相关参数及默认值如下表所示(默认0 表示由 Hudi 根据输入数据自动推断并行度):
| 参数 | 默认值 | 说明 |
|---|---|---|
| hoodie.insert.shuffle.parallelism | 0(自动) | insert 操作的 Shuffle 并行度 |
| hoodie.upsert.shuffle.parallelism | 0(自动) | upsert 操作的 Shuffle 并行度 |
| hoodie.bulkinsert.shuffle.parallelism | 0(自动) | bulk_insert 操作的并行度 |
自动推断在部分数据分布下会产生小文件,建议显式设置并行度,约为总输入数据量除以120MB。例如 60GB 输入建议设置为 512 左右。
文件大小与压缩
1、COW 表通过 parquet 最大文件大小(hoodie.parquet.max.file.size,默认 120MB)控制目标文件大小,写入时自动进行小文件合并(bin-packing);
2、MOR 表依赖 Compaction 合并日志文件,Spark 引擎与 Flink 引擎的压缩机制不同,参数不可混用:
| 引擎 | 压缩机制 | 关键参数 |
|---|---|---|
| Spark | 同步(inline)压缩:写入作业内,每累计一定数量 deltacommit 触发一次压缩 | hoodie.compact.inline.max.delta.commits(默认 5,即每 5 个 deltacommit 压缩一次;写入频繁且查询延迟敏感时调大,查询优化时调小) |
| Flink | 独立异步压缩任务:由compaction.tasks 算子后台异步执行,不阻塞写入 | compaction.async.enabled(默认 true)、compaction.tasks |
通用Spark 调优建议
1、Hudi 写入本质是 Spark 作业,资源配置、Shuffle 调优与数据倾斜处理参照 Spark 使用文档的调优章节;
2、upsert 大表时定位记录依赖索引查找,数据量大的表建议结合 Bloom 过滤(默认索引类型)并确认分区裁剪生效;
3、开启 AQE(spark.sql.adaptive.enabled=true)配合 Hudi 写入可减少小文件。