【问题标题】:structured streaming + kafka integration结构化流 + kafka 集成
【发布时间】:2020-10-18 15:46:05
【问题描述】:
我正在尝试使用带有 Kafka 的结构化流来读取和写入消息。如果我使用结构化流,spark 会将偏移量存储到检查点目录。
?
- 如果我想使用消费者组来处理某个主题的 Kafka 消息,它将如何工作?这里我们没有向 Kafka 提交偏移量,如果我们丢失了检查点目录,它将如何容错?
- 检查点位置应该如何?我可以为多个作业或多个消费者使用同一个检查点目录吗?
- 如果我将startingOffsets 配置为最早,是否会因为我们没有将偏移量提交给Kafka 而每次重新启动作业都会从头开始读取?
【问题讨论】:
标签:
apache-spark
pyspark
apache-kafka
spark-streaming
spark-structured-streaming
【解决方案1】:
-
默认情况下,结构化流生成一个唯一的组 id 来从 kafka 读取数据,从而确保没有其他消费者通过该组 id 读取数据。或者,您可以设置 kafka 组 ID 以从 kafka 读取数据,但您必须确保没有其他使用者使用该组 ID,否则您的作业可能只能读取部分数据。使用 hdfs 作为检查点目录和 hdfs 复制因子的结构化流确保即使一个节点关闭,数据也会复制到其他节点,这使得检查点具有容错性。
-
您必须在写入任何接收器时提供检查点位置,并且 spark 会保持在该触发器上处理的偏移范围。如果您将为多个作业提供相同的检查点位置,那么如果从同一主题消费就会有问题。
-
通过将startingOffsets 配置为最早,它每次总是从起点开始。在哪里提交偏移量并不重要。