AWS Glue配合Apache Hudi写入S3时如何仅保留最新1个文件
解决方案:Hudi S3路径仅保留最新版本文件的实现方法
推荐直接使用Hudi自带的清理和压缩机制实现,不会破坏Hudi表的元数据一致性,操作如下:
一、修改Hudi写入配置(直接适配你现有作业代码)
在你现有hudi_options中新增以下配置即可实现自动保留1份最新文件:
- 配置清理策略为仅保留最新文件版本:
'hoodie.cleaner.policy': 'KEEP_LATEST_FILE_VERSIONS' - 配置仅保留1个最新文件版本:
'hoodie.cleaner.fileversions.retained': '1' - 开启自动清理(默认已开启,可显式配置避免环境差异):
'hoodie.clean.automatic': 'true' - 你当前使用的是MERGE_ON_READ(MOR)存储类型,需要开启压缩将增量更新的日志文件合并为最新的base文件,可选择开启内联压缩:
- 开启内联压缩:
'hoodie.compact.inline': 'true' - 配置每次写入后触发压缩:
'hoodie.compact.inline.max.delta.commits': '1'
- 开启内联压缩:
修改后的完整配置示例:
hudi_options = { 'hoodie.table.name': tableName, 'hoodie.datasource.write.storage.type': 'MERGE_ON_READ', 'hoodie.compact.inline': 'true', 'hoodie.compact.inline.max.delta.commits': '1', 'hoodie.cleaner.policy': 'KEEP_LATEST_FILE_VERSIONS', 'hoodie.cleaner.fileversions.retained': '1', 'hoodie.clean.automatic': 'true', 'hoodie.datasource.write.recordkey.field': 'uuid', 'hoodie.datasource.write.partitionpath.field': 'partitionpath', 'hoodie.datasource.write.table.name': tableName, 'hoodie.datasource.write.operation': 'upsert', 'hoodie.datasource.write.precombine.field': 'ts', 'hoodie.upsert.shuffle.parallelism': 2, 'hoodie.insert.shuffle.parallelism': 2, }
二、其他可选方案
- 手动触发清理压缩:如果不希望每次写入都触发压缩、清理操作,可定期单独运行Hudi的清理、压缩任务,对存量历史表执行版本清理
- 切换存储类型:如果你对写入延迟要求不高,可将存储类型改为
COPY_ON_WRITE(COW),每次写入会直接生成新的base文件,配合上述清理策略无需额外压缩步骤,即可直接保留唯一最新版本文件
注意事项
不要直接通过S3生命周期规则或者手动删除S3文件,可能误删Hudi元数据文件导致表不可用,必须通过Hudi自带的清理机制执行删除操作。
内容的提问来源于stack exchange,提问作者satohh
相关产品推荐
相关产品推荐

