2016-06-17 27 views
2

我们在Red Hat 4.4.7上使用Spark 1.6和JVM 1.6来运行我们的Spark应用程序/作业。我们的一些流媒体作业使用复杂的状态,我们有scala case class来表示它们。但是,在测试工作的升级周期时,我们正面临以下一些问题。由于流式作业将永远运行,因此在设计易于升级的应用程序时需要帮助。火花流作业的可靠检查点(保持复杂状态)

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

  • 刚刚重新启动工作而不更改任何东西没有创建问题。
  • 做了随机变化后重新开始工作(与状态无关)没有创建问题。
  • 更改状态处理功能(如通过添加打印)重新启动作业没有创建问题。
  • 改变状态后重新启动作业(通过添加一个新的布尔型字段)确实造成问题。

做一些google搜索后,用于处理问题的一般原则似乎是,

  1. 为JSON或Avro中“与数据一起存储架构的格式”落实国家。
    • 客户端代码在进入状态之前必须进行序列化,并在从状态中读取它之后对其进行反序列化。序列化和反序列化将在每个流式处理间隔后发生,mapWithState可能会有所帮助。
    • 如果多个版本的作业可以共存,则必须明确处理从版本x到y的状态!!!
  2. 停止输入,完成输入处理,重新开始新的检查点作业。
    • 尽管这很容易实现,但对于我们的几个工作来说是不可能的。升级周期也会稍微复杂一些。
  3. 并行地将数据保存到外部存储并且在升级时将其加载为initialRDD。
    • 这将引入保持状态的外部依赖性。
    • 如果多个版本的作业可以共存,则必须明确处理从版本x到y的状态!!!

由于信息全部横跨网络分散,我感到困惑来的结论。下面是我的问题,

  1. 如果状态类的结构改变了检查点失效,但是,没有任何其他已知的问题,即检查点变为无效,如果装配罐子或国家类别的功能(没有结构)变化?
  2. 您正在使用什么策略来轻松升级有状态火花流作业?

回答

0

考虑像jvm/scala/spark /等环境升级的情况......无法保证检查点永远可靠,无论有何变化。

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

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

0

“最好的办法是定期刷新数据的可靠存储(HDFS/DB /等)以及任何形式的升级的情况下,读取相同的初始RDD”

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

+0

使用stateSnapshots – hustljian