我正在从HDFS检查点恢复流(例如ConstantInputDSTream),但我一直收到SparkException: <X> has not been initialized
。
从checkpointing恢复时,我需要做些什么吗?
我可以看到它希望DStream.zeroTime
设置,但是在恢复流时zeroTime
是null
。由于它是私人成员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(...)
答案 0 :(得分:12)
问题是我在从检查点重新创建StreamingContext后创建了dstreams,即在StreamingContext.getOrCreate
之后。创建dstreams和所有转换应该已经在createStreamingContext
。
答案 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,以保持简单。