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

2ul0zpep  于 2021-06-21  发布在  Flink
关注(0)|答案(1)|浏览(1330)

我仍然不清楚并行性的概念,假设我们有一个flink集群,它有足够的插槽。在我们的flink工作中,我们从3个不同的kafka集群中消费3个kafka主题,每个主题有10个分区。
如果我们想尽快使用消息。平行度应该是什么?
如果我们将并行度设置为10,那么将使用10个插槽,根据我的理解,这意味着10个线程,对吗?如果这10个线程“连接”到主题1,那么就没有线程读取主题2和主题3。
如果我们将parallelism设置为30,那么就有30个线程,但是这30个线程是否足够聪明,其中10个线程转到主题1,10个线程转到主题2,其余10个线程转到主题3?

kokeuurv

kokeuurv1#

Kafka消费群体
每个kafka使用者都属于一个使用者组,也就是说,它可以被认为是一组使用者的逻辑容器/名称空间。消费者组可以接收来自一个或多个主题的消息。使用者组中的示例可以从每个主题中的零个、一个或多个分区接收消息(取决于分区和使用者示例的数量)

Kafka是如何分配给Flink工人的?
在kafka中,来自同一消费者组的每个消费者被分配一个或多个分区。请注意,两个使用者不可能从同一分区消费。flink使用者的数量取决于flink并行性,这意味着每个flink任务(我们大致认为每个flink任务=flink slots=flink parallelism=available cpu core)可以作为使用者组中的一个单独使用者。另外,您应该注意到,主题只是对分区和数据进行分组的抽象,内部只有分区根据以下模式分配给flink的并行任务示例。
有三种可能的情况:
1.Kafka分区==flink并行
这种情况非常理想,因为每个使用者负责一个分区。如果消息在分区之间是平衡的,那么工作将均匀地分布在flink操作符上
2.Kafka·Flink
当flink任务多于kafka分区时,一些flink使用者将处于空闲状态,不读取任何数据:

在这种情况下,如果您的并行度高于分区数(因为您希望在将来的操作符中使用它),那么您可以 .rebalance() Kafka消息来源之后。这样可以确保kafka源代码之后的所有操作符都得到均匀的负载,代价是必须重新分发数据(因此存在反序列化+网络开销)。
3.Kafka分区>Flink并行
当kafka分区多于flink任务时,flink使用者示例将同时订阅多个分区:

在所有情况下,flink都会以最佳方式将任务分配给分区。
在您的例子中,可以使用flink-kafka连接器创建kafka消费者组,并为其指定一个或多个主题(例如,使用regex)。因此,如果kafka有三个主题,每个主题包括10个分区,为flink作业管理器分配30个插槽(核心),那么就可以实现理想的情况,即每个使用者(flink插槽)将使用一个kafka分区。
参考文献:1,2,3

相关问题