我有以下配置:
- 一个具有 2 个分区的 kafka 主题
- 一个 Zookeeper 实例
- 一个 kafka 实例
- 两个消费者具有相同的组 ID
Flink 作业片段:
speStream.addSink(new FlinkKafkaProducer011(kafkaTopicName,new
SimpleStringSchema(), props));
场景 1:
我在 eclipse 上编写了一个 flink 作业(Producer),它从文件夹中读取文件并将消息放在 kafka 主题上。
所以当我使用 eclipse 运行此代码时,它工作正常。
例如:如果我放置一个包含 100 条记录的文件,flink 会向分区 1 发送少量消息,向分区 2 发送少量消息,因此两个消费者都会收到少量消息。
场景 2: 当我创建上述代码的 jar 并在 flink 服务器上运行它时,flink 将所有消息发送到单个分区,因此只有一个消费者获得所有消息。
我希望场景 1 使用场景 2 中创建的 jar。
最佳答案
对于 Flink-Kafka Producers,添加“null”作为最后一个参数。
speStream.addSink(new FlinkKafkaProducer011(
kafkaTopicName,
new SimpleStringSchema(),
props,
(FlinkKafkaPartitioner) null)
);
对此的简短解释是,这会关闭 Flink 使用默认分区器 FlinkFixedPartitioner
。默认情况下关闭此功能将允许 Kafka 在其认为合适的分区之间分发数据。如果未关闭此功能,则用于利用 FlinkKafkaProducer 的接收器的每个并行性/任务槽将仅写入每个并行性/任务槽的一个分区。
关于apache-kafka - Flink kafka - Flink 作业不向不同分区发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52074674/