为什么Spark从检查点恢复时抛出“SparkException:DStream尚未初始化”?

时间:2016-01-29 17:09:39

标签: apache-spark spark-streaming checkpointing

我正在从HDFS检查点恢复流(例如ConstantInputDSTream),但我一直收到SparkException: <X> has not been initialized

从checkpointing恢复时,我需要做些什么吗?

我可以看到它希望DStream.zeroTime设置,但是在恢复流时zeroTimenull。由于它是私人成员IDK,因此无法恢复。我可以看到,已恢复的流引用的StreamingContext确实具有zeroTime的值。

initialize是一种私有方法,会在StreamingContext.graph.start被调用,但不会被StreamingContext.graph.restart调用,大概是因为它希望zeroTime被保留。

有人有一个从检查点恢复并且zeroTime具有非空值的Stream示例吗?

def createStreamingContext(): StreamingContext = {
    val ssc = new StreamingContext(sparkConf, Duration(1000))
    ssc.checkpoint(checkpointDir)
    ssc
}
val ssc = StreamingContext.getOrCreate(checkpointDir), createStreamingContext)

val socketStream = ssc.socketTextStream(...)
socketStream.checkpoint(Seconds(1))
socketStream.foreachRDD(...)

3 个答案:

答案 0 :(得分:12)

问题是我在从检查点重新创建StreamingContext后创建了dstreams,即在StreamingContext.getOrCreate之后。创建dstreams和所有转换应该已经在createStreamingContext

问题填写为[SPARK-13316] "SparkException: DStream has not been initialized" when restoring StreamingContext from checkpoint and the dstream is created afterwards

答案 1 :(得分:1)

当您尝试为2个不同的spark流式传输作业使用相同的检查指向目录时,也可能会发生此异常。在这种情况下,你也会得到这个例外。

尝试为每个火花作业使用唯一的检查点目录。

答案 2 :(得分:0)

错误StreamingContext:启动上下文时出错,将其标记为已停止 org.apache.spark.SparkException:org.apache.spark.streaming.dstream.FlatMappedDStream@6c17c0f8尚未初始化     在org.apache.spark.streaming.dstream.DStream.isTimeValid(DStream.scala:313)     在org.apache.spark.streaming.dstream.DStream $$ anonfun $ getOrCompute $ 1.apply(DStream.scala:334)     在org.apache.spark.streaming.dstream.DStream $$ anonfun $ getOrCompute $ 1.apply(DStream.scala:334)     在scala.Option.orElse(Option.scala:289)

上述错误是由于我还有另一个Spark Job写入同一个checkpointdir。即使另一个spark作业没有运行,它已经写入checkpointdir,新的Spark Job也无法配置StreamingContext。

我删除了checkpointdir的内容并重新提交了Spark Job,问题得到了解决。

或者,您可以为每个Spark作业使用单独的checkpointdir,以保持简单。