Spark Streaming - 从检查点重新启动重播最后一批

时间:2017-05-29 21:14:31

标签: apache-spark spark-streaming

我们正在尝试构建一个容错的火花流工作,我们遇到了一个问题。这是我们的情景:

    1) Start a spark streaming process that runs batches of 2 mins
    2) We have checkpoint enabled. Also the streaming context is configured to either create a new context or build from checkpoint if one exists
    3) After a particular batch completes, the spark streaming job is manually killed using yarn application -kill (basically mimicking a sudden failure) 
    4) The spark streaming job is then restarted from checkpoint

我们遇到的问题是,在重新启动火花流工作后,它会重放最后一个成功的批次。它总是这样做,只是重播最后一个成功的批次,而不是早期的批次

这样做的副作用是该批次的数据部分是重复的。我们甚至尝试在最后一次成功批处理之后等待超过一分钟才能终止进程(以防写入检查点需要时间),这没有帮助

任何见解?我没有在这里添加代码,希望有人也面对这个,并且可以给出一些想法或见解。如果有帮助,也可以发布相关代码。成功批次后不应该激发流检查点,以便重启后不重播?我放置 ssc.checkpoint 命令的位置是否重要?

3 个答案:

答案 0 :(得分:2)

您在问题的最后一行有答案。 ssc.checkpoint()的位置很重要。使用保存的检查点重新启动作业时,作业会显示正在保存的内容。因此,在您完成批处理后杀死作业的情况下,最近的一个是最后一个成功的。到目前为止,您可能已经明白,检查点主要是从您离开的地方开始 - 特别是对于失败的工作。

答案 1 :(得分:0)

有两件事需要注意。

1]确保在重新启动程序时,getOrCreate流上下文方法中使用了相同的检查点目录。

2]将“spark.streaming.stopGracefullyOnShutdown”设置为“true”。这允许spark完成处理当前数据并相应地更新检查点目录。如果设置为false,则可能导致检查点目录中的数据损坏。

注意:请尽可能发布代码段。是的,ssc.checkpoint的位置很重要。

答案 2 :(得分:0)

在这种情况下,应该确保在重新启动Spark应用程序后,流上下文方法中使用的检查点目录是相同的。希望它会有所帮助