如何通过Spark结构化流媒体确保卡夫卡数据摄取不会丢失数据?

问题描述

我有一个运行了很长时间的Spark结构化流作业,正在吸收kafka数据。我有一个问题如下。如果作业由于某种原因而失败并随后重新启动,则如何确保从断点处提取kafka数据,而不是在作业重新启动时始终获取当前数据和以后的数据。我是否需要明确指定诸如使用者组和auto.offet.reset等内容?火花卡夫卡摄取中是否支持它们?谢谢!

解决方法

根据Spark Structured Integration Guide,Spark本身一直在跟踪偏移量,没有偏移量被提交回Kafka。这意味着,如果您的Spark Streaming作业失败并重新启动,则有关偏移量的所有必要信息都存储在Spark的检查点文件中。这样,您的应用程序将知道从何处中断并继续处理其余数据。

我已经写了有关设置group.id和Spark在另一个post中的偏移量检查点的更多详细信息

以下是您的Spark结构化流作业最重要的Kafka特定配置:

group.id :Kafka源将自动为每个查询创建一个唯一的组ID。根据代码group.id将自动设置为

val uniqueGroupId = s"spark-kafka-source-${UUID.randomUUID}-${metadataPath.hashCode}

auto.offset.reset :设置源选项startingOffsets以指定从何处开始。 结构化流媒体管理哪些偏移量是在内部使用的,而不是依靠kafka消费者来完成

enable.auto.commit :Kafka源未提交任何偏移量。

因此,当前无法在结构化流中定义您的自定义group.id。Kafka使用者和结构化流将在内部管理偏移量,并且不会提交回Kafka(也不会自动)。