我正在使用Kafka源代码测试Flink。
我的测试场景如下。
数据已经存储在kafka主题中,Flink使用最早模式的FlinkKafkaConsumer消耗数据。
kafka分区的数量固定为15个。因此,当我通过改变Flink中并行性的数量来测试它时,15是理想的情况,它等于kafka分区的数量。
有趣的例子是,我使用了2个kafka主题,每个主题有15个分区。请注意,总数据分布在这两个主题中,因此整个数据大小与我使用上面提到的单个主题的情况相同。
在这种情况下,kafka簇有30个分区,所以我认为平行体的理想数量是30。然而,当我使用5个代理在集群中测试它时,在Flink任务管理器UI中发现了一些空闲实例(30个实例中有6个(。
因此,我的问题如下。
-
为什么有些实例是空闲的(30个实例中有6个(,尽管在两个主题中总共有30个分区?(我使用了30个并行度,这六个实例没有读取任何字节,我有足够的任务槽和资源(
-
当我们有一个主题并且假设分区>=并行主义,实例(=并行实例(消耗分区中数据的机制是什么?例如,有10个分区,我设置了5个并行性,然后这5个实例首先消耗5个分区,然后消耗其他5个分区中的剩余数据。或者,每个实例都以循环方式消耗分区中的数据?
-
假设2个主题有15个分区,并且只有15个并行性,那么在第一个主题中的数据被15个实例消耗之后,第二个主题数据随后被消耗?或者不管主题是什么,实例都消耗了分区?
期待您的回答。
Flink确实以循环方式将Kafka分区分配到插槽。对您来说,有趣的是(第一个分区的(起始槽是基于主题名称的散列的。随后的分区被发送到不断增加的插槽编号,当使用最后一个插槽时,这些插槽会自动结束。
因此,如果您的分区比插槽多,那么如果(partitions % slots) != 0
,则每个插槽的分区数可能不均匀。
如果您有多个主题,则会同时处理所有分区。因此,因为每个主题的第一个分区的起始槽是基于主题名称的哈希的,所以分区到槽的分布可能会更加不平衡。最糟糕的情况是,如果您有N个主题,每个主题都有一个分区,并且每个主题名称的hash % parallelism
都是相同的值,那么一个不幸的插槽将获得所有N个分区。