apache-kafka - flink并行和kafka分区在生产数据上有什么关系?
问题描述
我有一个关于将数据下沉到 Kafka 主题中的流作业和另一个使用 kafka 主题中的数据的流作业。我的 Kafka 集群的分区号的配置是3
.
当我将作业的并行度设置为 时4
,只有 3 个插槽忙于生成数据,并且只有 3 个消费者子任务获得了数据。
考虑到任务槽数的限制,我想把并行度改成1
. 但是,当我将作业的并行度设置为 时1
,只1 consumer task slot
得到数据。
在我看来,即使我将并行度设置为 1,我仍然会将数据下沉到 3 个分区中,并且可以有 3 个消费者子任务消费数据。
为什么只有一个消费者子任务在这里工作?
解决方案
每个 Kafka 分区只能被一个 FlinkKafkaConsumer 子任务消费,但一个 FlinkKafkaConsumer 可以从一个或多个分区消费。给定一个具有 3 个分区的主题,最多可以为 3 个 FlinkKafkaConsumer 分配工作。
一个 Flink 任务槽最多可以有你工作中每个任务的一个实例。插槽数等于最大可用并行度。
同样,Kafka 分区的数量设置了最大可实现并行度的上限。
将并行度设置为 1 时,只会使用一个 slot,并且该 slot 只能有一个 FlinkKafkaConsumer(和一个 FlinkKafkaProducer)。但是一个消费者可以处理所有 3 个分区。如果并行度设置为 3,则 3 个使用者可能很忙,每个使用者在自己的插槽中处理一个分区。并行度设置为 4 时,一个插槽将处于空闲状态。
在接收器中,默认情况下,每个实例都FlinkKafkaProducer
将以循环方式写入每个分区。FlinkKafkaPartitioner
如果您希望控制每条记录写入哪个分区,您可以提供自定义,或者您可以使用 aKafkaSerializationSchema
并为每个ProducerRecord
.
推荐阅读
- python - ModuleNotFoundError:没有名为“geventwebsocket”的模块
- java - 用于生成具有多个数字范围的唯一、复合、连续数字的方法
- azure-active-directory - Azure AD 企业应用程序 用户同意公司数据
- mobx - 我应该创建一个新的商店还是使用现有的商店?- Mobx 状态树?
- ubuntu - 从使用 qpdf 中删除密码失败
- html - 对面:悬停?
- react-native - 如何允许用户通过 Cognito 或 Social Provider 进行身份验证
- java - 将列更新为默认值而不在 Spring Data JPA 中指定它
- c++ - 如何对从 int 转换的十六进制数进行零填充?
- docker - 无法从 docker 容器连接到 aurora mysql 但可以使用命令行