如何在没有状态丢失的情况下升级或重启Spark流应用程序?

时间:2017-05-23 09:13:37

标签: apache-spark streaming spark-streaming stateful

我在我的应用程序代码中使用updateStateByKey(),即使重新启动此应用程序,我也希望保存状态。

这可以通过将状态保存到每个批次的某个位置来完成,但这样做可能会花费很多时间。

所以,我想知道在应用程序停止时是否存在可以存储状态的解决方案。

或者是否有其他解决方案来升级应用程序代码而不会丢失当前状态?

2 个答案:

答案 0 :(得分:0)

目前,从Spark 2.1.0开始,还没有一个解决方案能够开箱即用,如果你想升级,你必须自己存储数据。一种可能性不是使用updateStateByKeymapWithState并将状态存储在外部的某个位置,例如在键值存储中。

Spark 2.2将带来一个基于HDFS的新的有状态商店,但我还没有机会看看它是否克服了当前检查点实施的弱点。

答案 1 :(得分:0)

在每批中保存状态有很多选项。我在this answer列出了大部分内容。由于您突出了这增加的延迟(通过网络,序列化等),我想指出SnappyData。 SnappyData将内存数据库与Spark深度集成,以便它们共享相同的JVM和块管理器。这消除了每个批处理期间的序列化步骤,这可以在您写出状态时改善延迟。此外,它可以在您的请求停止时按照您的要求保持状态。

(免责声明:我是SnappyData的员工)