计划构建 Spark 结构化流应用程序,该应用程序从 Kafka 主题读取 json 数据,解析数据并写入任何存储。
val df = spark
.readStream
.format("kafka")
.option("kafka.bootstrap.servers", "host1:port1,host2:port2")
.option("subscribe", "topic1")
.option("kafka.group.id", "myConsumerGroup")
.load()
根据 Spark 文档,消费者组 id 由 Apache Spark ie 内部生成。默认情况下,每个查询都会生成一个唯一的组id来读取数据,或者我们可以使用kafka.group.id指定。据我所知,在一个消费者组内,任何时候一个kafka分区只能被一个消费者消费。如果我们要做的只是读取、解析和写入,那么kafka.group.id有什么意义,我们需要显式设置它吗?
我们需要明确设置这个吗?
不。正如您所发现的,Spark 会自动创建一个。您还可以给出组前缀而不是静态字符串。
如果我们要做的只是读、解析、写,那还有什么意义
这并不是一个真正的 Spark 问题。 Kafka 消费者使用消费者组来实现可扩展性并防止重复读取
您可以使用该值手动将偏移量存储回 Kafka,但除此之外,检查点文件可以比 Kafka 的至少一次行为提供更好的处理保证。