Apache Flink:如何并行执行但保持消息顺序?

Ben*_*ape 3 parallel-processing apache-kafka apache-flink

我有几个关于flink的并行性的问题。这是我的设置:

我有 1 个主节点和 2 个从节点。在 flink 中,我创建了 3 个 kafka 消费者,每个消费者都来自不同的主题。
由于元素的顺序对我来说很重要,每个主题只有一个分区,我有 flink 设置来使用事件时间。

然后我在每个数据流上运行以下管道(以伪代码):

source
.map(deserialize)
.window
.apply
.map(serialize)
.writeTo(sink)
Run Code Online (Sandbox Code Playgroud)

到目前为止,我以-p 2假设这将允许我使用我的两个节点的参数启动我的 flink 程序。结果不是我所希望的,因为我的输出顺序有时会混乱。

在阅读了 flink 文档并试图更好地理解它之后,有人可以确认我的以下“学习”吗?

1.) Passing-p 2仅配置任务并行度,即一个任务(例如map(deserialize))将被拆分成的最大并行实例数。如果我想在整个管道中保持订单,我必须使用-p 1.

2.) 这对我来说似乎矛盾/令人困惑:即使并行度设置为 1,不同的任务仍然可以并行(同时)运行。因此,如果我通过 ,我的 3 个管道也将并行运行-p 1

作为一个后续问题:有没有办法找出哪些任务映射到哪个任务槽,以便我可以自己确认并行执行?

我将不胜感激任何输入!

更新

下面是 flink 的执行计划-p 2

Ben*_*ape 5

Apache Flink 用户电子邮件列表上提出问题后,这里是答案:

1.) 该-p选项定义了每个作业的任务并行度。如果选择的并行度高于 1 并且数据被重新分配(例如通过 rebalance() 或 keyBy()),则无法保证顺序。

2.)-p设置为 1 时仅使用 1 个任务槽,即 1 个 CPU 核心。因此,可能有多个线程在一个内核上并发运行,但不是并行运行。

至于我的要求:为了并行运行多个管道并保持顺序,我可以只运行多个 Flink 作业,而不是在同一个 Flink 作业中运行所有管道。