在 Flink 中,由于 Exactly-Once 语义的保证,(在较新版本中被替换为 )在每次 Checkpoint 触发时,都会强制将“进行中(in-progress)”的文件滚动(roll)并提交为“已完成(finished)”状态。 因此,文件生成速度 = Checkpoint 频率 × Sink 算子的并行度。如果 Checkpoint 间隔是 1 分钟,并行度是 100,那么每天将产生 144,000 个文件,这会迅速拖垮 HDFS NameNode 或导致 S3 API 请求费用飙升及查询性能下降。 解决这个问题,通常有以下几种方案,按推荐程度和技术栈从易到难排列: --- 方案一:使用 Flink 1.15+ 原生的 Sink 异步合并功能(强烈推荐) 如果你使用的是 Flink 1.15 及以上版本,Flink 官方终于在 DataStream API 的 中内置了小文件合并(Compaction)功能。它会在文件写入后,异步地将多个小文件合并成大文件,并且不会影响 Checkpoint 的时长。 实现代码示例: 方案二:Flink SQL 的 Auto Com...