![](/img/trans.png)
[英]Spark Streaming + Kafka: how to check name of topic from kafka message
[英]How to set specific offset number while consuming message from Kafka topic through Spark streaming Scala
我正在使用下面的 spark streaming Scala 代码来消费来自生产者主题的实时 kafka 消息。 但问题是有时我的工作由于服务器连接或其他原因而失败,并且在我的代码中自动提交属性设置为真,因为某些消息丢失并且无法存储在我的数据库中。
所以只想知道如果我们想从特定的偏移量中提取旧的 kafka 消息,有什么办法。 我试图将“auto.offset.reset”设置为最早或最新,但它只获取尚未提交的新消息。
让我们在这里举个例子,比如我当前的偏移量是 1060,自动偏移重置属性是最早的,所以当我重新启动我的工作时,它开始从 1061 读取消息,但在某些情况下,如果我想从偏移量 1020 读取旧的 kafka 消息,那么是我们可以使用任何属性从特定偏移量开始使用消息
import org.apache.spark._
import org.apache.spark.streaming._
import org.apache.spark.streaming.kafka010.ConsumerStrategies.Subscribe
import org.apache.spark.streaming.kafka010.LocationStrategies.PreferConsistent
import org.apache.spark.streaming.StreamingContext._
val conf = new SparkConf().setMaster("local[2]").setAppName("NetworkWordCount")
val ssc = new StreamingContext(conf, Seconds(1))
val topic = "test123"
val kafkaParams = Map(
"bootstrap.servers" -> "localhost:9092",
"key.deserializer" -> classOf[StringDeserializer],
"value.deserializer" -> classOf[KafkaAvroDeserializer],
"schema.registry.url" -> "http://abc.test.com:8089"
"group.id" -> "spark-streaming-notes",
"auto.offset.reset" -> "earliest"
"enable.auto.commit" -> true
)
val stream = KafkaUtils.createDirectStream[String, Object](
ssc,
PreferConsistent,
Subscribe[String, Object](topic, KafkaParams)
stream.print()
ssc.start()
ssc.awaitTermination()
从 Spark Streaming,你不能。 您需要使用kafka-consumer-groups
CLI 来提交特定于您的组 ID 的偏移量。 或者手动构造一个 KafkaConsumer 实例并在启动 Spark 上下文之前调用 commitSync。
import org.apache.kafka.clients.consumer.KafkaConsumer
val c = KafkaConsumer(...)
val toCommit: java.util.Map[TopicPartition,OffsetAndMetadata] = ...
c.commitSync(toCommit) // But don't do this every run of your app
ssc.start()
或者,Structured Streaming确实提供startingOffsets
配置。
auto.offset.reset 仅适用于不存在的 group.id
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.