Flink - 利用输入分区来避免任务管理器间的通信

Flink - take advantage of input partitioning to avoid inter task-manager communications

我们有一个 Flink 管道通过将数据与相同的键(“client-id”)组合在一起并在相同的 window.

中聚合每个“客户端”的数据

这个问题可以简单地并行化,输入的 Kafka 主题有几个分区(与 Flink 并行度的数量相同)——每个分区都包含一个客户端子集。即,单个客户端始终位于特定的 Kafka 分区中

Flink 会自动利用这一点还是会重新洗牌? 如果是后者,我们能否以某种方式避免重新洗牌并将数据保留在每个运算符的本地由输入分区分配?

注意:我们实际上是在 Flink 后端使用 Apache Beam,但我试图尽可能地简化问题。 Beam 使用 FixedWindows 后跟 Combine.perKey

我不熟悉 Beam 的 Flink runner 的内部结构,但假设它使用的是 Flink keyBy,那么这将涉及网络洗牌。这可以避免,但只能通过使用低级 Flink 原语而不是键控 windows 和键控状态重新实现作业来相当痛苦。

Flink 确实提供了 reinterpretAsKeyedStream,可用于避免不必要的洗牌,但这只能应用于现有分区与 keyBy 将执行的操作完全匹配的情况——我认为没有理由认为会在这里申请。