增加 Flink 中的并行度 decreases/splits 整体吞吐量

Increasing Parallelism in Flink decreases/splits the overall throughput

我的问题与 this 完全相似,除了我的应用程序中的背压是 "OK"。

我以为问题出在我的本地机器没有足够的配置,所以我创建了一个 72 核 Windows 机器,我从 Kafka 读取数据,在 Flink 中处理它,然后写回输出在卡夫卡。我已经检查过,写入 Kafka Sink 不会引起任何问题。

我正在寻找的是可能通过增加并行度导致任务槽之间的吞吐量分裂的区域?

Flink 版本:1.7.2

Scala 版本:2.12.8

卡夫卡版本:2.11-2.2.1

Java版本:1.8.231

应用程序工作:数据来自 Kafka(1 个分区),由 Flink 反序列化(这里的吞吐量为 5k/秒)。然后反序列化的消息通过基本模式验证(这里的吞吐量是 2k/sec)。 即使将并行度增加到 2,级别 1(反序列化阶段)的吞吐量保持不变,并且 不会像预期那样增加两倍

我明白,没有代码,调试起来很困难,所以我想问问你对这个问题的建议,这样我就可以回到我的代码上试试。

We are using 1 Kafka partition for our input topic.

如果要并行处理数据,实际上需要并行读取数据。

并行读取数据有一定的要求。最重要的一次是源能够实际将数据拆分为更小的工作块。例如,如果您从文件系统读取,您有多个文件,或者系统将文件细分为 splits。对于 Kafka,这必然意味着 你必须有更多的分区 。理想情况下,您拥有的分区至少与最大消费者并行度一样多。

5k/s 似乎是您可以在一个分区上实现的最大吞吐量。您还可以通过要达到的最大吞吐量来计算分区数。如果要达到50k/s,至少需要10个分区。您应该使用更多以防再处理或故障恢复。

另一种分配工作的方法是添加 manual shuffle step。这意味着,如果你保持单一输入分区,你仍然只能达到 5k/s,但之后工作实际上被重新分配并并行处理,这样你就不会看到之后吞吐量的大幅下降。在洗牌操作之后,工作在并行的下游任务之间稍微均匀地分布。