如何在Spark作业失败后不从头开始使用kafka消息

时间:2019-04-04 13:05:42

标签: apache-spark apache-kafka

我是kafka和spark的新手,想知道在spark工作失败后如何从kafka中恢复胶印。

条件:

  1. 说kafka流为5gb / s,从一开始就很难消耗

  2. 流数据已被消耗,因此如何告诉spark重新使用消息/顺利地重做失败的任务

我不确定要搜索哪个区域,也许有人可以将我指向正确的方向

2 个答案:

答案 0 :(得分:1)

与kafka进行交易时,我们必须有2个不同的主题。一个成功,一个失败。

比方说,我有2个主题,主题成功和主题失败。 当Kafka成功处理数据流时,我们可以将其标记并存储在Topic-Success主题中,而当Kafka无法处理数据流时,我们将其存储在Topic-Failed主题中。

因此,当您要重新使用失败的数据流时,我们可以处理主题失败的主题中失败的数据流。在这里,您可以消除从一开始就重复使用所有数据的情况。

希望这对您有所帮助。

答案 1 :(得分:0)

在kafka 0.10.x中,有一个Consumer Group的概念,用于跟踪消息的偏移量。

如果已启用enable.auto.commit = true和auto.offset.reset = latest,则从一开始就不会消耗它。现在采用这种方法,您可能还需要跟踪偏移量,因为消耗后该过程可能会失败。我建议您使用Spark Docs中建议的这种方法

stream.foreachRDD { rdd =>
  val offsetRanges = rdd.asInstanceOf[HasOffsetRanges].offsetRanges

  // some time later, after outputs have completed
  stream.asInstanceOf[CanCommitOffsets].commitAsync(offsetRanges)
} 

当端到端管道被执行时,CanCommitOffsets会自动提交这些消息