我在我的应用程序代码中使用updateStateByKey()
,即使重新启动此应用程序,我也希望保存状态。
这可以通过将状态保存到每个批次的某个位置来完成,但这样做可能会花费很多时间。
所以,我想知道在应用程序停止时是否存在可以存储状态的解决方案。
或者是否有其他解决方案来升级应用程序代码而不会丢失当前状态?
答案 0 :(得分:0)
目前,从Spark 2.1.0开始,还没有一个解决方案能够开箱即用,如果你想升级,你必须自己存储数据。一种可能性不是使用updateStateByKey
或mapWithState
并将状态存储在外部的某个位置,例如在键值存储中。
Spark 2.2将带来一个基于HDFS的新的有状态商店,但我还没有机会看看它是否克服了当前检查点实施的弱点。
答案 1 :(得分:0)
在每批中保存状态有很多选项。我在this answer列出了大部分内容。由于您突出了这增加的延迟(通过网络,序列化等),我想指出SnappyData。 SnappyData将内存数据库与Spark深度集成,以便它们共享相同的JVM和块管理器。这消除了每个批处理期间的序列化步骤,这可以在您写出状态时改善延迟。此外,它可以在您的请求停止时按照您的要求保持状态。
(免责声明:我是SnappyData的员工)