Flink,使用多个Kafka源时如何正确设置并行性?

时间:2019-03-13 03:39:04

标签: apache-flink flink-streaming

我仍然不清楚并行性,比如说我们有一个flink集群,它有足够的插槽。在我们的flink工作中,我们从3个不同的kafka集群中消费3个kafka主题,每个主题都有10个分区。

如果我们想尽快使用该消息。并行性应该是什么?

如果我们将并行度设置为10,那么将使用10个插槽,根据我的理解,这意味着10个线程对吗?如果这10个线程“连接”到topic_1,则没有线程读取topic_2和topic_3。

如果将并行度设置为30,则有30个线程,但是这30个线程是否足够聪明,以至于其中10个进入topic_1,其中10个进入topic_2,其余10个进入topic_3? / p>

1 个答案:

答案 0 :(得分:1)

Kafka消费群体

每个Kafka消费者都属于一个消费者组,即可以将其视为一堆消费者的逻辑容器/命名空间。消费者组可以接收来自一个或多个主题的消息。使用者组中的实例可以从每个主题中的零个,一个或多个分区接收消息(取决于分区和使用者实例的数量)

enter image description here

如何将Kafka分区分配给Flink工作者?

在Kafka中,来自同一消费者组的每个消费者都被分配了一个或多个分区。注意,两个使用者不可能从同一个分区进行消费。 Flink使用者的数量取决于Flink并行性,这意味着每个Flink任务(我们大致认为每个Flink任务= Flink插槽= Flink并行性=可用的CPU内核)可以充当使用者组中的单独使用者。另外,您应该注意到,主题只是对分区和数据进行分组的抽象,内部仅根据以下模式将分区分配给Flink的并行任务实例。

有三种可能的情况:

1。 kafka分区== flink并行性

这种情况是理想的,因为每个消费者都照顾一个分区。如果您的消息在分区之间保持平衡,则工作将平均分配给Flink运营商

2。 kafka分区

当Flink任务多于Kafka分区时,某些Flink使用者将只是空闲,而不读取任何数据:

enter image description here

在这种情况下,并行性比分区数高 (因为您想在以后的运算符中使用它),可以在Kafka源代码之后执行.rebalance()。这样可以确保在Kafka源之后的所有操作员都能获得均匀的负载,但要以重新分配数据为代价(因此需要进行反序列化/序列化+网络开销)。

3。 kafka分区> flink并行性

当Kafka分区多于Flink任务时,Flink使用者实例将同时预订多个分区:

enter image description here

在所有情况下,Flink都会以最佳方式将Task分配给分区。在您的情况下,您可以使用Flink Kafka连接器创建多个Kafka Consumer Group,并为其分配主题(例如,使用Regex)。因此,如果Flink具有三个每个10个分区的使用者组,并为Flink Job Manager分配了30个插槽(核心),则可以实现理想的情况。

推荐人: 123