如何从Spark中的kafka从特定偏移量读取记录直到结束?

时间:2019-01-17 10:04:28

标签: scala apache-spark apache-kafka

我有一个场景,来自控制台生产者,我产生了4条消息,通过spark我能够通过spark.read()方法获得这4条消息。现在,情况是这样的,当我再产生3条消息时,我只想使用spark.read()获得最后3条消息,而不是那4条消息。数据不是作为流来的。

spark.read()具有参数“ startingOffset”和“ endingOffset”,因此,我想如果可以从主题中获取最后一条消息的偏移量,那么它将可以。

我尝试了几件事:

  1. 通过创建第二个使用者并将其订阅此消息,随后使用consumer.commited(topicAndPartition)来获取元数据,然后从该元数据中进行偏移。

此方法存在问题:

它运行,但是,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
  1. 我尝试使用.poll()获取记录,并获取最后一条消息的偏移量,但记录列表显示为空,但事实并非如此。我有关于此主题的消息,并且已经使用控制台进行了检查。代码看起来像这样。

    val recordsFromConsumer = consumer.poll(10000)
    val recordsFromConsumerList = recordsFromConsumer.records("MessagePassingTopic").toList
    val lastOffset = recordsFromConsumerList.last.offset()```
    

此方法存在问题:

recordsFromConsumerList 不返回任何记录。因此,没有机会获得最新记录,因此.last.offset()也不起作用。

如果有更好的方法可以完成此任务,或者我做错了任何事情,请告诉我。任何帮助表示赞赏。

0 个答案:

没有答案