如何在spark结构化流式读取流中回放Kafka Offsets

时间:2018-05-11 16:22:38

标签: apache-spark spark-structured-streaming

我有一个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或最早。

我是否可以清理检查点,在这种情况下,我不知道检查点目录的位置,因为在上述情况下我没有指定任何检查点。

2 个答案:

答案 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

相关问题