关键功能

最近更新时间: 2026-03-13 09:03:00

该处的小文件合并,是一个广义的hudi数据表的重新组织优化,包括 MOR 表的行文件和基础base 文件的合并;基础base 文件的合并及数据重新排序;历史版本数据的清理等操作。hudi自身提供的上述相关操作同步和异步处理,但是在生产环境中会影响业务数据任务的正常运行,因此正常情况下使用异步的方式对hudi 数据表文件进行整理优化,提高数据访问性能。上述文件的优化合并及清理功能,理论上没有先后顺序。实际使用上建议的数据文件优化处理流程如下:

Compaction

该功能只对MOR 表有效(如果hudi 表类型是COW 表,该步骤省略),该功能是将mor 表的base file 和 log file 进行整理合并成一个新的base file,以提高查询执行效率,其异步执行参数和命令如下:

spark-submit  --class org.apache.hudi.utilities.HoodieCompactor \
/xxx/hudi-utilities-bundle_2.12-*.jar \
--spark-memory '4g' \
--mode 'scheduleAndExecute' \
--base-path "/user/hive/warehouse/hudi.db/small_file_hudi_mor" \
--table-name "small_file_hudi_mor" \
--hoodie-conf "hoodie.compact.schedule.inline=false" \
--hoodie-conf "hoodie.compact.inline=false" \
--hoodie-conf "hoodie.compact.inline.max.delta.commits=1"

核心参数说明:

配置项 设定值 说明
jar 路径及版本 /xxx/hudi-utilities-bundle_2.12-*.jar jar 包路径信息,该路径为测试路径,实际中根据实际部署的路径进行设定。
--spark-memory 4g spark 计算资源内存使用,根据实际数据情况调整计算资源量。
--mode scheduleAndExecute Compaction 执行模式设置参数,设置为排期并执行,在一个任务里面完成相关的合并操作。
--base-path /user/hive/warehouse/hudi.db/small_file_hudi_mor 进行 Compaction 的数据路径信息,设置为对应表的路径,进行整个表的数据合并。
--table-name small_file_hudi_mor 要Compaction 的数据表名。
hoodie.compact.schedule.inline false hudi 配置项,是否进行异步调度排期。这里使用异步模式。设置为false
hoodie.compact.inline false hudi 配置项,是否内联同步合并。这里使用异步模式。设置为false
hoodie.compact.inline.max.delta.commits 1 触发Compaction 之前要保留的最大增量提交数,提交多少次commits 后,才触发合并。

其他参数详见:https://hudi.apache.org/docs/configurations#Compaction-Configs

Clustering

Clustering 是一种通用的数据布局优化手段,Spark SQL/Hive 中的 cluster by 和 Cassandra 中的 clustering key 都是 Clustering 思想的具体实现,只是 Hudi 的 Clustering 除了这一标准功能外还多了一项合并小文件的工作。该处主要进行小文件合并处理,如果业务上有需要,可以添加数据重排序处理,其异步执行参数和命令如下:

  spark-submit --jars 'hudi-utilities-bundle_2.12-*.jar' \
  --class 'org.apache.hudi.utilities.HoodieClusteringJob' \
  /xxx/hudi-utilities-bundle_2.12-*.jar \
  --spark-memory '4g' \
  --mode 'scheduleAndExecute' \
  --base-path "/user/hive/warehouse/hudi.db/small_file_hudi_cow/" \
  --table-name "small_file_hudi_cow" \
  --hoodie-conf "hoodie.clustering.async.enabled=true" \
  --hoodie-conf "hoodie.clustering.async.max.commits=1" \
  --hoodie-conf "hoodie.clustering.plan.strategy.small.file.limit=536870912" \
  --hoodie-conf "hoodie.clustering.plan.strategy.target.file.max.bytes=1073741824"

核心参数说明:

配置项 设定值 说明
jar 路径及版本 /xxx/hudi-utilities-bundle_2.12-*.jar jar 包路径信息,该路径为测试路径,实际中根据实际部署的路径进行设定。
--spark-memory 4g spark 计算资源内存使用,根据实际数据情况调整计算资源量。
--mode 'scheduleAndExecute' Clustering 执行模式设置参数,设置为排期并执行,在一个任务里面完成相关的小文件合并操作。
--base-path /user/hive/warehouse/hudi.db/small_file_hudi_mor 进行 Clustering 的数据路径信息,设置为对应表的路径,进行整个表的数据小文件合并。
--table-name small_file_hudi_mor 要Clustering 的数据表名。
hoodie.clustering.async.enabled true hudi 配置项,是否允许异步小文件合并。这里使用异步模式。设置为true
hoodie.clustering.async.max.commits 1 hudi 配置项,异步合并小文件执行的最大 commit 数。
hoodie.clustering.plan.strategy.small.file.limit 536870912 hudi 配置项,小于该值时,被认为小文件。然后对这些小文件进行合并。
hoodie.clustering.plan.strategy.target.file.max.bytes 1073741824 合并后的文件最大大小,
hoodie.clustering.plan.strategy.sort.columns 数据列 排序列,根据业务查询需要,可以在合并过程中进行数据排序。

其他参数详见:https://hudi.apache.org/docs/configurations#Clustering-Configs

Cleaning

对于每次更新hudi 表数据,就会生成一个新版本的数据文件用于保存更新后的记录(COPY_ON_WRITE) 或将这些增量更新写入日志文件以避免重写更新版本的数据文件 (MERGE_ON_READ)。在这种情况下,根据更新频率,文件版本数可能会无限增长,但大部分业务如果不需要保留无限的历史记录。因此就需要通过清理服务,来删除历史不需要的版本数据,其异步执行参数和命令如下:

spark-submit --class org.apache.hudi.utilities.HoodieCleaner /xxx/hudi-utilities-bundle_2.12-*.jar \
  --target-base-path "/user/hive/warehouse/hudi.db/small_file_hudi_cow/" \
  --hoodie-conf "hoodie.cleaner.policy=KEEP_LATEST_FILE_VERSIONS" \
  --hoodie-conf "hoodie.cleaner.fileversions.retained=1" \
  --hoodie-conf "hoodie.cleaner.parallelism=200" \
  --hoodie-conf "hoodie.clean.async=true" \
  --hoodie-conf "hoodie.clean.automatic=false"

核心参数说明:

配置项 设定值 说明
jar 路径及版本 /xxx/hudi-utilities-bundle_2.12-*.jar jar 包路径信息,该路径为测试路径,实际中根据实际部署的路径进行设定。
hoodie.cleaner.policy KEEP_LATEST_FILE_VERSIONS hudi 配置项,清理策略。设置为保留N个版本数据。
hoodie.cleaner.fileversions.retained 1 hudi 配置项,保留多少个版本数据,根据业务情况进行设置。
hoodie.cleaner.parallelism 200 hudi 配置项,清理执行的并行度。
hoodie.clean.async true hudi 配置项,是否异步清理。设置为true。
hoodie.clean.automatic false hudi 配置项,是否自动内联清理,因为异步清理,设置为false。

其他参数详见:https://hudi.apache.org/docs/configurations#Clean-Configs