我正在Spark 1.6中创建一个Kafka流:
kafkaProps.setConfig("group.id", UUID.randomUUID().toString())
kafkaProps.createConfiguration()
kafkaProps.toImmutableMap.foreach {keyVal => println(keyVal._1 + "=" + keyVal._2)}
val ssc = new StreamingContext( sc, Seconds(2) )
val stream = ssc.createKafkaStream[String, String, StringDeserializer, StringDeserializer](
kafkaProps,
List(kafkaProps.getConfig("kafka.topic"))
)
stream.print()
ssc.start()
ssc.awaitTerminationOrTimeout(30000)
ssc.stop(stopSparkContext=false, stopGracefully=true)
kafkaProps包含:
...
group.id=3abedbf7-2aed-436a-b4bc-0517a9c5c419
...
auto.offset.reset=smallest
...
group.id 每次运行代码时都会更改它的值。我认为这足以在每次从Kafka消费时运行我的应用程序时将偏移量重置为零,但不会检索主题中的旧项目。
有什么想法吗?
答案 0 :(得分:1)
自从提出这个话题以来,似乎已经过去了很多年。但是,我想为将要使用它的其他人回答。
答案是streaming-kafka-010会忽略“ auto.offset.reset”,如果没有则将其设置为“ none”。
您可以在org.apache.spark.streaming.kafka010.KafkaUtil的fixKafkaParams方法中找到这段代码。
logWarning(s"overriding ${ConsumerConfig.AUTO_OFFSET_RESET_CONFIG} to none for executor")
kafkaParams.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "none")
有关org.apache.spark.streaming.kafka010.KafkaRDD中的覆盖的进一步说明,其中重新检查了“ auto.offset.rest”的值。
require("none" == kafkaParams.get(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG).asInstanceOf[String],
ConsumerConfig.AUTO_OFFSET_RESET_CONFIG +
" must be set to none for executor kafka params, else messages may not match offsetRange")
通常,KafkaStreaming不支持“ auto.offset.reset”
答案 1 :(得分:0)
您是否尝试'最早'而不是'最小'作为值?
https://kafka.apache.org/documentation#configuration
[最新,最早,无]是新消费者的价值
[最小,最大]是旧消费者的值
答案 2 :(得分:0)
我无法找到方法StreamingContext#createKafkaStream
的定义。你能澄清一下你在哪里找到它吗?
尝试使用Spark official documentation
中提到的KafkaUtils
创建Kafka流
val directKafkaStream = KafkaUtils.createDirectStream[
[key class], [value class], [key decoder class], [value decoder class] ](
streamingContext, [map of Kafka parameters], [set of topics to consume])