火花流作业的可靠检查点(保持复杂状态)
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 来表示它们。但是在测试作业的升级周期时,我们面临如下问题。由于流式作业将永远 运行,因此需要帮助设计易于升级的应用程序。
我正在检查作业无法从检查点重新启动的确切用例。
- 只是重新启动作业而不做任何更改没有产生问题。
- 随机更改后重新启动作业(与状态无关)没有产生问题。
- 更改状态处理功能后重新启动作业(例如通过添加打印)没有产生问题。
- 更改状态后重新启动作业(通过添加新的布尔字段)确实产生了问题。
经过一些谷歌搜索后,处理该问题的一般准则似乎是,
- 实现状态为"a format that stores schema along with data"为json或avro。
- 客户端代码必须在将其放入状态之前进行序列化,并在从状态读取之后将其反序列化。序列化和反序列化将在每个流式传输间隔之后发生,mapWithState 可能会有所帮助。
- 如果作业的多个版本可以共存,则必须显式处理将状态从版本 x 升级到 y!!!!
- 停止输入,完成对输入的处理,重新启动一个带有新检查点的新作业。
- 虽然这很容易实现,但对于我们的几个工作来说是不可能的。而且升级周期会变得稍微复杂。
- 同时将数据保存到外部存储,并在升级时将其加载为 initialRDD。
- 这将引入一个外部依赖来保持状态。
- 如果作业的多个版本可以共存,则必须显式处理将状态从版本 x 升级到 y!!!!
由于信息散布在网络上,我很难得出结论。以下是我的问题,
- 如果状态 class 的结构发生变化,检查点将变为无效,但是,如果状态 class 变化?
- 您使用什么策略来轻松升级有状态的 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 的访问?
我们在 Red Hat 4.4.7 上使用 Spark 1.6 和 JVM 1.6 来 运行 连接我们的 spark 流 applications/jobs。我们的一些流式作业使用复杂状态,我们用 scala case class 来表示它们。但是在测试作业的升级周期时,我们面临如下问题。由于流式作业将永远 运行,因此需要帮助设计易于升级的应用程序。
我正在检查作业无法从检查点重新启动的确切用例。
- 只是重新启动作业而不做任何更改没有产生问题。
- 随机更改后重新启动作业(与状态无关)没有产生问题。
- 更改状态处理功能后重新启动作业(例如通过添加打印)没有产生问题。
- 更改状态后重新启动作业(通过添加新的布尔字段)确实产生了问题。
经过一些谷歌搜索后,处理该问题的一般准则似乎是,
- 实现状态为"a format that stores schema along with data"为json或avro。
- 客户端代码必须在将其放入状态之前进行序列化,并在从状态读取之后将其反序列化。序列化和反序列化将在每个流式传输间隔之后发生,mapWithState 可能会有所帮助。
- 如果作业的多个版本可以共存,则必须显式处理将状态从版本 x 升级到 y!!!!
- 停止输入,完成对输入的处理,重新启动一个带有新检查点的新作业。
- 虽然这很容易实现,但对于我们的几个工作来说是不可能的。而且升级周期会变得稍微复杂。
- 同时将数据保存到外部存储,并在升级时将其加载为 initialRDD。
- 这将引入一个外部依赖来保持状态。
- 如果作业的多个版本可以共存,则必须显式处理将状态从版本 x 升级到 y!!!!
由于信息散布在网络上,我很难得出结论。以下是我的问题,
- 如果状态 class 的结构发生变化,检查点将变为无效,但是,如果状态 class 变化?
- 您使用什么策略来轻松升级有状态的 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 的访问?