我有一个场景,来自控制台生产者,我产生了4条消息,通过spark我能够通过spark.read()方法获得这4条消息。现在,情况是这样的,当我再产生3条消息时,我只想使用spark.read()获得最后3条消息,而不是那4条消息。数据不是作为流来的。
spark.read()具有参数“ startingOffset”和“ endingOffset”,因此,我想如果可以从主题中获取最后一条消息的偏移量,那么它将可以。
我尝试了几件事:
此方法存在问题:
它运行,但是,consumer.commited()方法返回null,并且由于该Consumer.commited(topicAndPartition).offset()。toLong返回NullPointerException。
这是代码。
val properties = new Properties()
properties.put("bootstrap.servers", "localhost:9092")
properties.put("group.id","12238868")
properties.put("key.deserializer","org.apache.kafka.common.serialization.StringDeserializer")
properties.put("value.deserializer","org.apache.kafka.common.serialization.StringDeserializer")
properties.put("enable.auto.commit","true")
val consumer = new KafkaConsumer[String, String](properties)
val topic = Array("MessagePassingTopic")
val topicAndPartition = new org.apache.kafka.common.TopicPartition("MessagePassingTopic", 0)
consumer.subscribe(util.Arrays.asList("MessagePassingTopic"))
val offsetAndMetadata = consumer.committed(topicAndPartition)
val endOffset = offsetAndMetadata.offset().toLong
我尝试使用.poll()获取记录,并获取最后一条消息的偏移量,但记录列表显示为空,但事实并非如此。我有关于此主题的消息,并且已经使用控制台进行了检查。代码看起来像这样。
val recordsFromConsumer = consumer.poll(10000)
val recordsFromConsumerList = recordsFromConsumer.records("MessagePassingTopic").toList
val lastOffset = recordsFromConsumerList.last.offset()```
此方法存在问题:
recordsFromConsumerList 不返回任何记录。因此,没有机会获得最新记录,因此.last.offset()也不起作用。
如果有更好的方法可以完成此任务,或者我做错了任何事情,请告诉我。任何帮助表示赞赏。