如何在Spark Streaming Context上调用stop()后继续批处理

时间:2018-01-18 13:07:26

标签: apache-spark apache-kafka streaming spark-streaming

我们正在撰写一篇关于Spark Ba​​tch / Stream Processing效率的论文。我们尝试检测大量数据中的异常,我们需要的是哪个日志行经历哪个过程。

因此,我们创建了一个事件模拟,在每个过程之前和之后,我们记录线到达/离开该阶段的时间。

但我们面临的一个问题是,我们不希望分析流处理的时间包含在这些计算中。所以我们基本上需要的是

使用流式传输进行一些计算, 调用ssc.stop(false,true)(通过HTTP或检测文件末尾), 继续处理有关性能的分析

但Spark的问题在于它不允许我们在调用stop之后处理DStreams。有没有办法复制我们的最后一个DStream,以便我们可以在调用stop()后访问其对象?

我们在尝试这样做时遇到的错误是:

    Exception in thread "main" java.lang.IllegalStateException: Adding new inputs, transformations, and output operations after stopping a context is not supported

代码架构基本上是这样的:

    val sparkConf = new SparkConf().setAppName("DirectKafkaWordCount").setMaster("local[" + CPUNumber + "]")
    val ssc = new StreamingContext(sparkConf, Seconds(1))

    //Some ml algorithms
    val x = b.map(something)
    ssc.start()

    ssc.awaitTermination()
    ssc.stop(false)

    //Some analytical tracking map reduce jobs
    val y = x.map(getanalytics)

在此先感谢,任何想法都非常适合

1 个答案:

答案 0 :(得分:0)

您可以这样做:

b.foreachRDD(r -> stopwatch = Stopwatch.createStarted())
b.map(something)
b.foreachRDD(r -> System.out.println(stopwatch)
ssc.start()

然后你可以在每一轮中耗费时间。