我有一个Spark Structured Streaming作业,配置为从Kafka读取数据。请仔细检查代码,查看readStream()
参数,以便从Kafka中读取最新数据。
我理解readStream()
在启动新查询时从第一个偏移读取,而不是在恢复时。
但是每次我在IntelliJ中重新开始工作时,我都不知道如何开始新的查询。
val kafkaStreamingDF = spark
.readStream
.format("kafka")
.option("kafka.bootstrap.servers", AppProperties.getProp(AppConstants.PROPS_SERVICES_KAFKA_SERVERS))
.option("subscribe", AppProperties.getProp(AppConstants.PROPS_SDV_KAFKA_TOPICS))
.option("failOnDataLoss", "false")
.option("startingOffsets","earliest")
.load()
.selectExpr("CAST(value as STRING)", "CAST(topic as STRING)")
我还尝试按"""{"topicA":{"0":0,"1":0}}"""
以下是我的写作流
val query = kafkaStreamingDF
.writeStream
.format("console")
.start()
每次我在IntelliJ IDE中重启我的工作时,日志显示偏移量已设置为最新值而不是0或最早。
我是否可以清理检查点,在这种情况下,我不知道检查点目录的位置,因为在上述情况下我没有指定任何检查点。
答案 0 :(得分:0)
Kafka依靠财产auto.offset.reset
来处理抵消管理。
默认为“最新”,这意味着缺少有效的偏移量,消费者将从最新的记录开始读取(消费者开始运行后写入的记录)。替代方案是“最早”,这意味着缺少有效的偏移量,消费者将从头开始读取分区中的所有数据。
根据您的问题,您想要阅读主题中的全部数据。因此,将“startingOffsets
”设置为“earliest
”应该有效。但是,还要确保将enable.auto.commit
设置为false。
将enable.auto.commit
设置为true
表示自动提交偏移,其频率由配置auto.commit.interval.ms
控制。
将此设置为true会在从Kafka读取消息时自动将偏移提交给Kafka,这并不一定意味着Spark已完成处理这些消息。要启用精确控制以提交偏移,请将Kafka参数enable.auto.commit
设置为false
。
答案 1 :(得分:0)
尝试设置.option("kafka.client.id", "XX")
,以使用其他client.id
。