Kafka 消费者的主题和分区发现

时间:2021-05-05 21:43:05

标签: scala apache-kafka apache-flink kafka-consumer-api

我对 Flink 和 Kafka 还很陌生,有一些用 Scala 编写的数据聚合作业在 Apache Flink 中运行,这些作业使用来自 Kafka 的数据执行聚合并将结果返回给 Kafka。

我需要这些作业来使用在作业运行时创建的与模式匹配的任何新 Kafka 主题中的数据。我通过为我的消费者设置以下属性来实现这一目标

val properties = new Properties()
properties.setProperty(“bootstrap.servers”, “my-kafka-server”)
properties.setProperty(“group.id”, “my-group-id”)
properties.setProperty(“zookeeper.connect”, “my-zookeeper-server”)
properties.setProperty(“security.protocol”, “PLAINTEXT”)
properties.setProperty(“flink.partition-discovery.interval-millis”, “500”);
properties.setProperty(“enable.auto.commit”, “true”);
properties.setProperty(“auto.offset.reset”, “earliest”);

val consumer = new FlinkKafkaConsumer011[String](Pattern.compile(“my-topic-start-.*”), new SimpleStringSchema(), properties)

消费者工作正常并使用以“my-topic-start-”开头的现有主题中的数据

当我第一次发布针对新主题的数据时,例如“my-topic-start-test1”,我的消费者直到主题创建 500 毫秒后才识别该主题,这是基于特性。 当消费者识别主题时,它不会读取发布的第一条数据记录,而是开始如此有效地读取后续记录,每次针对新主题发布数据时,我都会丢失第一条数据记录。

是否有我遗漏的设置,或者 Kafka 是如何工作的?任何帮助将不胜感激。

谢谢 沙文

1 个答案:

答案 0 :(得分:0)

我认为问题的一部分是我的生产者一次性创建主题和发布消息,所以当消费者发现消息已经生成的新分区时。

作为临时解决方案,我更新了我的生产者以在主题不存在时创建该主题,然后发布一条消息(使其成为 2 个步骤的过程)并且这有效。

如果有一个更强大的消费者端解决方案会很好:)