Spark Streaming检查点:如何选择合适的检查点间隔

问题描述

我正在尝试为我的Spark Streaming应用程序确定适当的检查点间隔。它的Spark Kafka集成基于不带状态等的直接流。Spark docs谈论检查点,但是我认为它简短,不能提供其建议的理由,或者可能太明显了,但我没有能够弄清楚。

如果我的微批处理间隔是2分钟,并且假设每个微批处理只需要15秒,那么我的检查点间隔也应该不是2分钟吗?

假设我的流式传输应用程序从t = 0开始,以下是我的检查点的状态:

情况1:检查点间隔小于微批处理间隔

如果我将检查点间隔保持为1分钟,那么:

t = 1m: 在此检查点中没有不完整的批次

t = 2m: 将第一个微批处理作为不完整的微批处理包含在检查点中,然后开始执行微批处理

t = 3m: 检查点中没有不完整的批处理,因为第一个微批处理仅在15秒内就完成了处理

t = 4m: 第二个微批处理作为不完整的微批处理包含在检查点中,然后开始执行微批处理

t = 4m30s: 系统崩溃;重新启动流应用程序时,将第二个微批处理作为不完整的微批处理在t = 4处找到检查点,然后再次对其进行处理。但是,既然第二次微批处理已在= 4m15s处完成,再次进行处理的意义何在?

情况2:检查点间隔大于微批处理间隔

如果我将检查点间隔保持在4分钟,那么:

t = 2m 第一次微批处理开始

t = 4m 包含第二个微批处理的第一个检查点是唯一不完整的批处理;第二次微批处理开始

案例2.1:系统在t = 2m30s时崩溃: 第一个微批处理的执行时间是在= 2m15s,但自第一个微批处理以来没有任何检查点信息检查点将在t = 4m发生。因此,当流式应用重新启动时,它将通过从Kafka获取偏移量来重新执行。

案例2.2:系统在t = 5m时崩溃: 第二个微批处理已在15秒内完成,即t = 4m15s,这意味着在t = 5时理想没有不完整的批次。当我重新启动应用程序时,流应用程序从t = 4m处的检查点发现第二个微批处理不完整,然后重新执行该微批处理。

我的理解正确吗?如果是,那么我的检查点间隔设置是否不正确,是否导致上述所有情况下的重复处理?如果是,那么如何选择合适的检查点间隔?任何解释基本原理的输入都将真正有帮助。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...