【发布时间】:2017-10-23 03:44:44
【问题描述】:
我在我的应用程序代码中使用updateStateByKey(),即使我重新启动这个应用程序,我也想保存状态。
这可以通过将状态保存到每批的某个地方来完成,但这样做可能需要很多时间。
所以,不知道有没有办法可以在应用停止时存储状态。
或者是否有其他解决方案可以在不丢失当前状态的情况下升级应用程序代码?
【问题讨论】:
标签: apache-spark streaming spark-streaming stateful
我在我的应用程序代码中使用updateStateByKey(),即使我重新启动这个应用程序,我也想保存状态。
这可以通过将状态保存到每批的某个地方来完成,但这样做可能需要很多时间。
所以,不知道有没有办法可以在应用停止时存储状态。
或者是否有其他解决方案可以在不丢失当前状态的情况下升级应用程序代码?
【问题讨论】:
标签: apache-spark streaming spark-streaming stateful
目前,从 Spark 2.1.0 开始,还没有解决方案可以开箱即用,如果要升级,您必须自己存储数据。一种可能性是不使用 updateStateByKey 或 mapWithState 并将状态存储在外部某处,例如键值存储中。
Spark 2.2 将带来一个基于 HDFS 的新状态存储,但我还没有机会查看它是否克服了当前检查点实现的弱点。
【讨论】:
在每个批次中保存状态的选项有很多。我在this answer 中列出了其中的大部分。由于您强调了这增加的延迟(通过网络、序列化等),我想指出SnappyData。 SnappyData 将内存数据库与 Spark 深度集成,因此它们共享相同的 JVM 和块管理器。这消除了每批期间的序列化步骤,这应该会在您写出状态时改善延迟。此外,它可以根据您的要求在您的应用程序停止时保持该状态。
(免责声明:我是 SnappyData 的员工)
【讨论】: