首页 > 解决方案 > flink并行和kafka分区在生产数据上有什么关系?

问题描述

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

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

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

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

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

标签: apache-kafkaapache-flink

解决方案


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

一个 Flink 任务槽最多可以有你工作中每个任务的一个实例。插槽数等于最大可用并行度。

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

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

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


推荐阅读