apache-kafka - Flink kafka - Flink 作业不向不同分区发送消息

标签 apache-kafka apache-flink kafka-producer-api

我有以下配置:

  1. 一个具有 2 个分区的 kafka 主题
  2. 一个 Zookeeper 实例
  3. 一个 kafka 实例
  4. 两个消费者具有相同的组 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/

相关文章:

linux - kafka logs + 如何限制日志大小

java - 多个消费者 Spring Kafka

java - 如何在 Kafka 0.11 中正确提交生产者并消费事务消息?

java - Kafka Streams - 根据流数据发送不同的主题

ssl - 为 kafka-console-consumer 配置 SSL 和 ACL

java - 使用 Flink 1.2 从 Avro 文件读取数据

java - Kafka 事务生产者——尽管中止,read_committed 仍显示记录

java - Apache Flink 与 Elasticsearch 集成

java - Flink - 多源集成测试

apache-kafka - 卡夫卡领导人选举何时举行?