我们在Red Hat 4.4.7上使用Spark 1.6和JVM 1.6来运行我们的Spark应用程序/作业。我们的一些流媒体作业使用复杂的状态,我们有scala case class来表示它们。但是,在测试工作的升级周期时,我们正面临以下一些问题。由于流式作业将永远运行,因此在设计易于升级的应用程序时需要帮助。火花流作业的可靠检查点(保持复杂状态)
我正在检查作业无法从检查点重新启动的确切用例。
- 刚刚重新启动工作而不更改任何东西没有创建问题。
- 做了随机变化后重新开始工作(与状态无关)没有创建问题。
- 更改状态处理功能(如通过添加打印)重新启动作业没有创建问题。
- 改变状态后重新启动作业(通过添加一个新的布尔型字段)确实造成问题。
做一些google搜索后,用于处理问题的一般原则似乎是,
- 为JSON或Avro中“与数据一起存储架构的格式”落实国家。
- 客户端代码在进入状态之前必须进行序列化,并在从状态中读取它之后对其进行反序列化。序列化和反序列化将在每个流式处理间隔后发生,mapWithState可能会有所帮助。
- 如果多个版本的作业可以共存,则必须明确处理从版本x到y的状态!!!
- 停止输入,完成输入处理,重新开始新的检查点作业。
- 尽管这很容易实现,但对于我们的几个工作来说是不可能的。升级周期也会稍微复杂一些。
- 并行地将数据保存到外部存储并且在升级时将其加载为initialRDD。
- 这将引入保持状态的外部依赖性。
- 如果多个版本的作业可以共存,则必须明确处理从版本x到y的状态!!!
由于信息全部横跨网络分散,我感到困惑来的结论。下面是我的问题,
- 如果状态类的结构改变了检查点失效,但是,没有任何其他已知的问题,即检查点变为无效,如果装配罐子或国家类别的功能(没有结构)变化?
- 您正在使用什么策略来轻松升级有状态火花流作业?
使用stateSnapshots – hustljian