flink并行与kafka分区生产数据有什么关系?

What's the relationship between flink parallelism and kafka partition in producing data?

我有一个关于将数据下沉到 Kafka 主题中的流式作业和另一个使用 kafka 主题中的数据的流式作业。我的kafka集群的partition number的配置是3.

当我将作业的并行度设置为 4 时,只有 3 个插槽忙于生产数据,只有 3 个消费者子任务获得数据。

考虑到任务槽数的限制,想把并行度改成1。但是,当我将作业的并行度设置为 1 时,只有 1 consumer task slot 获得了数据。

在我看来,即使我将并行度设置为1,我仍然将数据下沉到3个分区中,并且可以有3个消费者子任务消费数据。

为什么只有一个消费者子任务在这里工作?

每个Kafka分区只能被一个FlinkKafkaConsumer子任务消费,但一个FlinkKafkaConsumer可以从一个或多个分区消费。给定一个有 3 个分区的主题,最多可以为 3 个 FlinkKafkaConsumers 分配工作。

一个 Flink task slot 最多只能有一个你 job 中每个 task 的实例。插槽数等于最大可用并行度。

同样,Kafka 分区的数量设置了可实现的最大并行度的上限。

parallelism设置为1时,只会使用一个slot,那个slot只能有一个FlinkKafkaConsumer(和一个FlinkKafkaProducer)。但是那个消费者可以处理所有 3 个分区。如果并行度设置为 3,则 3 个消费者可以忙碌,每个消费者在自己的槽中处理一个分区。并行度设置为 4 时,将有一个插槽空闲。

在接收器中,默认情况下 FlinkKafkaProducer 的每个实例都将以循环方式写入每个分区。如果您希望控制每条记录写入哪个分区,您可以提供自定义 FlinkKafkaPartitioner,或者您可以使用 KafkaSerializationSchema 并为每个 ProducerRecord.

指定分区