使用 Flink 实现 ETL 作业时如何保留记录的顺序?

How to preserve order of records when implementing an ETL job with Flink?

假设我想用Flink实现一个ETL作业,source和sink都是Kafka topic,只有一个partition
source 和 sink 中的记录顺序对下游很重要(我的 ETL 中有更多作业消耗 sink,作业由其他团队维护。)。
有什么方法可以确保接收器中记录的顺序与源相同,并使并行度大于 1?

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

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

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

如果在一个键一个键的基础上维持排序就足够了,那么只有一个分区,你总是没问题的。如果并行使用多个分区,那么如果您使用 keyBy(或 SQL 中的 GROUP BY),只有当一个键的所有事件始终在同一个 Kafka 分区中时,您才可以。