我对 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 是如何工作的?任何帮助将不胜感激。
谢谢 沙文
答案 0 :(得分:0)
我认为问题的一部分是我的生产者一次性创建主题和发布消息,所以当消费者发现消息已经生成的新分区时。
作为临时解决方案,我更新了我的生产者以在主题不存在时创建该主题,然后发布一条消息(使其成为 2 个步骤的过程)并且这有效。
如果有一个更强大的消费者端解决方案会很好:)