【问题标题】:How to preserve order of records when implementing an ETL job with Flink?使用 Flink 实现 ETL 作业时如何保留记录顺序?
【发布时间】:2026-01-30 16:20:04
【问题描述】:

假设我想用 Flink 实现一个 ETL 作业,它的源和接收器都是只有一个分区的 Kafka 主题。
source 和 sink 中的记录顺序对下游很重要(我的 ETL 有更多的作业消耗 sink,作业由其他团队维护。)。
有什么办法可以保证 sink 中的记录顺序和 source 一致,并且并行度大于 1?

【问题讨论】:

    标签: apache-flink flink-streaming


    【解决方案1】:

    https://*.com/a/69094404/2000823 涵盖了您的部分问题。基本原则是两个事件将保持它们的相对顺序,只要它们在执行图中采用相同的路径。否则,事件将相互竞争,并且无法保证排序。

    如果您的作业在任务之间只有 FORWARD 连接,则将始终保留顺序。如果你使用 keyBy 或 rebalance (改变并行),那么它不会。

    不能并行读取(或写入)具有一个分区的 Kafka 主题。您可以增加作业的并行度,但这只会对中间任务产生有意义的影响(因为在这种情况下,源和接收器不能并行运行)——这会引入事件最终乱序的可能性.

    如果在逐个键的基础上保持排序就足够了,那么只需要一个分区就可以了。如果多个分区并行使用,那么如果您使用 keyBy(或 SQL 中的 GROUP BY),则只有当一个键的所有事件始终位于同一个 Kafka 分区中时,您才可以。

    【讨论】:

    • “如果事件在执行图中采用相同的路径,它们将保持它们的相对顺序” -> 所有 Flink 设计都保留了这种语义并且不会被破坏吗?
    • 这仅在流执行模式下有效。在批处理模式下,可以更改顺序。
    最近更新 更多