如何记住Spark Streaming应用程序重启之间的状态?

时间:2017-05-26 12:51:46

标签: apache-spark spark-streaming

我正在学习Spark Streaming。我想保持状态更新,并能够使用mapWithState更新状态。我还在上下文中启用了检查点。如果我必须停止/重新启动工作,我想记住状态。现在每次重启都会重新开始。我尝试了各种现金,检查点选项,并通过大量发布进行扫描,但没有得到清晰的图片。

环境: 我在开发中本地运行Spark,也作为HDP沙箱运行。 (我在两种环境中都尝试过)。

  1. 是否可以记住杀死Spark作业的状态并重新启动它。 (没有任何编程更改)。

  2. 如果可能的话怎么样?任何指针或建议都会有所帮助。 (我已尝试过chekpoints,缓存在单个RDD上,MapwithStateRDD在本地以及HDP sanbox中)。

  3. 我没有尝试的唯一选择是将MapWithStateRDD保存到磁盘并将其作为initialRDD读回。不管怎么说这不是正确的选择。

  4. 我只找到一个没有答案的类似问题。 Spark Checkpoint doesn't remember state (Java HDFS)

    感谢。

    代码:

      def getStreamingContext(streamingApp : (SparkContext, Duration) => StreamingContext, sc : SparkContext, batchDuration: Duration) = {
        val creatingFunc = () => streamingApp(sc, batchDuration)
        val ssc = sc.getCheckpointDir match {
          case Some(checkpointDir) =>
            println("Get or Create Context")
            StreamingContext.getActiveOrCreate(checkpointDir, creatingFunc, sc.hadoopConfiguration, createOnError = true)
          case None =>
            print("New Context")
            StreamingContext.getActiveOrCreate(creatingFunc)
        }
        sc.getCheckpointDir.foreach( cp => ssc.checkpoint(cp))
        println(ssc.getState())
        ssc
      }
    

    Spark版本2.1.0

1 个答案:

答案 0 :(得分:1)

我得到了它...感谢以下Q / A. [link](Spark streaming not remembering previous state

我在updateStateByKey

之后缺少以下行

statefulActivity.checkpoint(分钟(1))

添加持续时间以及启用检查点目录会记住重新启动时的状态。