【问题标题】:Kafka consuming the latest message again when I rerun the Flink consumer当我重新运行 Flink 消费者时,Kafka 再次使用最新消息
【发布时间】:2016-07-10 07:52:25
【问题描述】:

我在 Scala 编写的 Apache Flink API 中创建了一个 Kafka 消费者。每当我传递来自某个主题的一些消息时,它都会收到它们。但是,当我重新启动消费者时,它不会接收新的或未使用的消息,而是使用发送到该主题的最新消息。

这是我正在做的事情:

  1. 运行生产者:

    $ bin/kafka-console-producer.sh --broker-list localhost:9092 --topic corr2
    
  2. 运行消费者:

    val properties = new Properties()
    properties.setProperty("bootstrap.servers", "localhost:9092")
    properties.setProperty("zookeeper.connect", "localhost:2181")
    properties.setProperty("group.id", "test")
    
    val env = StreamExecutionEnvironment.getExecutionEnvironment
    val st = env
        .addSource(new FlinkKafkaConsumer09[String]("corr2", new SimpleStringSchema(), properties))
    env.enableCheckpointing(5000)
    st.print()
    env.execute()
    
  3. 传递一些消息

  4. 停止消费者
  5. 再次运行消费者会打印我发送的最后一条消息。我希望它只打印新消息。

【问题讨论】:

    标签: apache-kafka apache-flink


    【解决方案1】:

    您正在运行一个检查点间隔为 5 秒的 Kafka 消费者。 因此,每 5 秒,Flink 就会创建一个操作员状态(偏移量)的副本以进行恢复。

    一旦检查点完成,它将让操作员知道检查点已完成。根据该通知,Kafka 消费者将偏移量提交给 Zookeeper。所以大约每 5 秒,我们会将最后一个检查点的偏移量写入 ZK。

    当你再次启动 Flink 作业时,它会在 ZK 中找到偏移量并从那里继续。根据时间的不同,提交到 ZK 后收到的所有消息都会重新发送。

    您无法避免这种行为,因为.print()“操作员”不是检查点的一部分。它的意思是作为一个调试工具。 但是,参与检查点的数据接收器(例如滚动文件接收器)将确保不会将重复项写入文件系统。

    【讨论】:

    • 你能告诉zookeeper中偏移信息存储的路径吗?
    • 感谢@rmetzger,我运行了一个 flink 作业,并希望将偏移量存储在 zookeeper 的消费者路径中,但在消费者下,我只能看到 console-consumer-65334。我不确定发生了什么,您能否提出一些建议,为什么会发生这种情况?
    • 您使用的是 Kafka 0.8 还是 0.9? 0.9 默认不提交 ZK。您是否启用了检查点?如果不是,我们仅以 60 秒的间隔提交偏移量。因此,如果您之前取消了作业,您将不会在 ZK 中看到它。
    • 我使用的是 0.9,我还没有启用检查点,但我确实运行了一次超过 20 分钟的作业。
    猜你喜欢
    • 1970-01-01
    • 2016-10-31
    • 2023-03-03
    • 1970-01-01
    • 2017-11-09
    • 2020-11-11
    • 2017-11-16
    • 1970-01-01
    • 2017-08-18
    相关资源
    最近更新 更多