我正在尝试为我的spark流应用程序找出一个合适的检查点间隔。它的SparkKafka整合基于直接流无状态等。。spark文档谈到了检查点,但在我看来,它很简单,没有提供建议背后的理由,或者可能太明显了,但我还没有弄清楚。
如果我的微批处理间隔是2分钟,假设每个微批处理只需要15秒,那么我的检查点间隔不也应该正好是2分钟吗?
假设spark streaming应用程序在t=0时启动,检查点的状态如下:
案例1:检查点间隔小于微批次间隔
如果我将检查点间隔保持在1分钟,那么:
t=1m:此检查点没有不完整的批次
t=2m:第一个微批作为不完整的微批包含在检查点中,然后开始执行微批
t=3m:检查点中没有不完整的批次,因为第一个微批次仅在15秒内完成处理
t=4m:第二个微批作为不完整的微批包含在检查点中,然后开始执行微批
t=4m30s:系统故障;重新启动时,流应用程序会在t=4处找到检查点,并将第二个微批次作为不完整的微批次,然后再次对其进行处理。但是,既然第二个微批次的处理是在=4m15秒时完成的,那么再次处理它又有什么意义呢
案例2:检查点间隔大于微批次间隔
如果我将检查点间隔保持在4分钟,那么:
t=2m第一个微批量执行开始
t=4m第一个检查点,第二个微批次为唯一不完整批次;第二个微批处理开始
案例2.1:系统在t=2m30s时发生故障:第一个微批次执行在t=2m15s时完成,但是没有关于这个微批次的检查点信息,因为第一个检查点将在t=4m时发生。因此,当流应用程序重新启动时,它将通过从kafka获取偏移量来重新执行。
案例2.2:系统在t=5m时发生故障:第二个微批次已在15秒内完成,即t=4m15秒,这意味着在t=5时,理想情况下不应出现不完整批次。当我重新启动我的应用程序时,流式应用程序发现第二个微批在t=4m处的检查点处不完整,并重新执行该微批。
我的理解正确吗?如果是,那么不是我的检查点间隔设置不正确导致了上述所有情况下的重复处理?如果是,那么如何选择适当的检查点间隔?任何解释基本原理的输入都会很有帮助。
暂无答案!
目前还没有任何答案,快来回答吧!