parallel-processing - Apache 弗林克 : How to execute in parallel but keep order of messages?

标签 parallel-processing apache-kafka apache-flink

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

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

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

source
.map(deserialize)
.window
.apply
.map(serialize)
.writeTo(sink)

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

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

1.) 传递-p 2 仅配置任务并行性,即任务(例如map(deserialize))将被拆分的最大并行实例数进入。如果我想在整个管道中保持顺序,我必须使用 -p 1

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

作为后续问题:有什么方法可以确定哪些任务映射到哪个任务槽,以便我可以自己确认并行执行?

如有任何意见,我将不胜感激!

更新

Here是flink对-p 2的执行计划。

最佳答案

Apache Flink user email list 上提出问题后这是答案:

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

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

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

关于parallel-processing - Apache 弗林克 : How to execute in parallel but keep order of messages?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43392793/

相关文章:

apache-kafka - 如何使用控制台生产者在 Kafka 0.11 中生成带有标题的消息?

apache-flink - ProcessWindowFunction 中的 Apache Flink 状态

c++ - for 循环/for_each 的每次迭代都可以并行完成吗? (C++11)

parallel-processing - 使用交错寻址方法并行减少库冲突

apache-kafka - 使用 Kafka Streams 进行工作分配

apache-kafka - 如何用 Aeron 替换 Kafka

apache-flink - 我应该在使用 Apache Flink 的节点上的防火墙中打开哪些端口?

pojo - Apache Flink - 如何使用 AWS Kinesis 发送和使用 POJO

c# - .NET TPL 数据流源中的线程安全

parallel-processing - 使用 cudaMallocManaged 时不允许从全局函数调用 __host__ 函数