火花流作业的可靠检查点(保持复杂状态)

Reliable checkpoint (keeping complex state) for spark streaming jobs

我们在 Red Hat 4.4.7 上使用 Spark 1.6 和 JVM 1.6 来 运行 连接我们的 spark 流 applications/jobs。我们的一些流式作业使用复杂状态,我们用 scala case class 来表示它们。但是在测试作业的升级周期时,我们面临如下问题。由于流式作业将永远 运行,因此需要帮助设计易于升级的应用程序。

我正在检查作业无法从检查点重新启动的确切用例。

经过一些谷歌搜索后,处理该问题的一般准则似乎是,

  1. 实现状态为"a format that stores schema along with data"为json或avro。
    • 客户端代码必须在将其放入状态之前进行序列化,并在从状态读取之后将其反序列化。序列化和反序列化将在每个流式传输间隔之后发生,mapWithState 可能会有所帮助。
    • 如果作业的多个版本可以共存,则必须显式处理将状态从版本 x 升级到 y!!!!
  2. 停止输入,完成对输入的处理,重新启动一个带有新检查点的新作业。
    • 虽然这很容易实现,但对于我们的几个工作来说是不可能的。而且升级周期会变得稍微复杂。
  3. 同时将数据保存到外部存储,并在升级时将其加载为 initialRDD。
    • 这将引入一个外部依赖来保持状态。
    • 如果作业的多个版本可以共存,则必须显式处理将状态从版本 x 升级到 y!!!!

由于信息散布在网络上,我很难得出结论。以下是我的问题,

  1. 如果状态 class 的结构发生变化,检查点将变为无效,但是,如果状态 class 变化?
  2. 您使用什么策略来轻松升级有状态的 Spark Streaming 作业?

考虑像jvm/scala/spark/etc这样的环境升级案例...无论发生任何变化,都不能保证检查点永远可靠。

检查点旨在帮助在 fault/crash 的不幸事件中恢复,而不是用作数据存储!!!

最好的替代方法是定期将数据刷新到可靠的存储中 (HDFS/DB/etc...),并在发生任何形式的升级时读取与初始 RDD 相同的内容。

"The best alternative is to periodically flush the data in to a reliable store (HDFS/DB/etc...) and read the same as initial RDD in the event of any form of upgrade"

如何定期将 Spark 状态数据刷新到外部存储中?是否有 API 调用可以提供对 Spark StateRDD 的访问?