Flink中具有并行数的多个卡夫卡主题



我正在使用Kafka源代码测试Flink。

我的测试场景如下。

数据已经存储在kafka主题中,Flink使用最早模式的FlinkKafkaConsumer消耗数据。

kafka分区的数量固定为15个。因此,当我通过改变Flink中并行性的数量来测试它时,15是理想的情况,它等于kafka分区的数量。

有趣的例子是,我使用了2个kafka主题,每个主题有15个分区。请注意,总数据分布在这两个主题中,因此整个数据大小与我使用上面提到的单个主题的情况相同。

在这种情况下,kafka簇有30个分区,所以我认为平行体的理想数量是30。然而,当我使用5个代理在集群中测试它时,在Flink任务管理器UI中发现了一些空闲实例(30个实例中有6个(。

因此,我的问题如下。

  1. 为什么有些实例是空闲的(30个实例中有6个(,尽管在两个主题中总共有30个分区?(我使用了30个并行度,这六个实例没有读取任何字节,我有足够的任务槽和资源(

  2. 当我们有一个主题并且假设分区>=并行主义,实例(=并行实例(消耗分区中数据的机制是什么?例如,有10个分区,我设置了5个并行性,然后这5个实例首先消耗5个分区,然后消耗其他5个分区中的剩余数据。或者,每个实例都以循环方式消耗分区中的数据?

  3. 假设2个主题有15个分区,并且只有15个并行性,那么在第一个主题中的数据被15个实例消耗之后,第二个主题数据随后被消耗?或者不管主题是什么,实例都消耗了分区?

期待您的回答。

Flink确实以循环方式将Kafka分区分配到插槽。对您来说,有趣的是(第一个分区的(起始槽是基于主题名称的散列的。随后的分区被发送到不断增加的插槽编号,当使用最后一个插槽时,这些插槽会自动结束。

因此,如果您的分区比插槽多,那么如果(partitions % slots) != 0,则每个插槽的分区数可能不均匀。

如果您有多个主题,则会同时处理所有分区。因此,因为每个主题的第一个分区的起始槽是基于主题名称的哈希的,所以分区到槽的分布可能会更加不平衡。最糟糕的情况是,如果您有N个主题,每个主题都有一个分区,并且每个主题名称的hash % parallelism都是相同的值,那么一个不幸的插槽将获得所有N个分区。

相关内容

  • 没有找到相关文章

最新更新