【发布时间】:2016-06-17 09:36:10
【问题描述】:
我们在 Red Hat 4.4.7 上使用带有 JVM 1.6 的 Spark 1.6 来运行我们的 Spark 流应用程序/作业。我们的一些流式作业使用复杂状态,我们有 scala 案例类来表示它们。但是在测试作业的升级周期时,我们面临以下一些问题。由于流式作业将永远运行,因此在设计易于升级的应用程序时需要帮助。
我正在检查作业无法从检查点重新启动的确切用例。
- 只是重新启动作业而不更改任何内容不会造成问题。
- 在进行随机更改(与状态无关)后重新启动作业没有产生问题。
- 在更改状态处理功能(如添加打印)后重新启动作业没有产生问题。
- 在更改状态后重新启动作业(通过添加新的布尔字段)确实产生了问题。
在进行了一些谷歌搜索之后,处理该问题的一般准则似乎是,
- 将状态实现为“将架构与数据一起存储的格式”,如 json 或 avro。
- 客户端代码必须先进行序列化,然后才能将其置于状态,并在从状态读取后对其进行反序列化。序列化和反序列化将在每个流式传输间隔之后进行,mapWithState 可能会有所帮助。
- 如果作业的多个版本可以共存,则必须明确处理从版本 x 升级到 y 的状态!!!
- 停止输入,完成对输入的处理,重新开始一个新的工作,新的检查点。
- 虽然这很容易实现,但对于我们的几个工作来说是不可能的。升级周期也会变得稍微复杂。
- 将数据并行保存到外部存储,并在升级时将其加载为 initialRDD。
- 这将引入一个外部依赖项来保持状态。
- 如果作业的多个版本可以共存,则必须明确处理从版本 x 升级到 y 的状态!!!
由于信息分散在整个网络上,我感到很困惑,无法得出结论。以下是我的问题,
- 如果状态类的结构发生更改,则检查点将变为无效,但是,如果状态类的程序集 jar 或功能(而非结构)发生更改,是否还有其他已知问题导致检查点变得无效?
- 您使用什么策略可以轻松升级有状态 Spark 流作业?
【问题讨论】:
标签: apache-spark spark-streaming