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

时间:2016-06-17 09:36:10

标签: apache-spark spark-streaming

我们在Red Hat 4.4.7上使用Spark 1.6和JVM 1.6来运行我们的火花流应用程序/作业。我们的一些流媒体作业使用复杂的状态,我们有scala案例类来表示它们。但在测试作业的升级周期时,我们面临的问题如下。由于流媒体作业将永远运行,因此需要帮助设计易于升级的应用程序。

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

  • 只需重新启动作业而不更改任何内容没有创建问题。
  • 进行随机更改后重新启动作业(与状态无关)没有创建问题。
  • 在更改状态处理功能后重新启动作业(例如添加打印)没有创建问题。
  • 更改状态后重新启动作业(通过添加新的布尔字段)确实会产生问题。

在做了一些谷歌搜索后,处理问题的一般准则似乎是,

  1. 将状态实现为“将模式与数据一起存储的格式”,如json或avro。
    • 客户端代码必须在将其置于状态之前进行序列化,并在从状态读取后对其进行反序列化。序列化和反序列化将在每个流间隔后发生,mapWithState可能会有所帮助。
    • 如果作业的多个版本可以共存,则必须明确处理从版本x升级到y的状态!!!
  2. 停止输入,完成输入处理,重新启动作为新检查点的新作业。
    • 虽然这很容易实现,但我们的工作几乎不可能。升级周期也会稍微复杂一些。
  3. 并行地将数据保存到外部存储,并在升级时将其作为initialRDD加载。
    • 这将引入一个外部依赖关系来保持状态。
    • 如果作业的多个版本可以共存,则必须明确处理从版本x升级到y的状态!!!
  4. 由于信息分散在整个网络上,我觉得很难得出结论。以下是我的问题,

    1. 如果状态类的结构发生更改,则检查点变为无效,但是,如果状态类的程序集jar或功能(非结构)发生更改,是否存在检查点变为无效的其他已知问题?
    2. 您正在使用什么策略来轻松升级有状态的火花流媒体作业?

2 个答案:

答案 0 :(得分:1)

考虑一个像jvm / scala / spark / etc这样的环境升级的情况......无论有什么变化,都无法保证检查点永远可靠。

检查点旨在帮助仅在故障/崩溃的不幸事件中恢复,而不是设计用作数据存储!!!

最好的选择是定期将数据刷新到可靠的存储(HDFS / DB / etc ...),并在任何形式的升级时读取与初始RDD相同的数据。

答案 1 :(得分:0)

&#34;最好的选择是定期将数据刷新到可靠的存储(HDFS / DB / etc ...),并在任何形式的升级时读取与初始RDD相同的内容&#34; < / p>

如何定期将Spark State数据刷新到外部商店?是否有可以提供对Spark StateRDD的访问的API调用?