在以下代码中,似乎是将函数fn1和fn2按顺序方式应用于inRDD,正如我在Spark Web UI的“阶段”部分中看到的那样。

 DstreamRDD1.foreachRDD(new VoidFunction<JavaRDD<String>>()
 {
     public void call(JavaRDD<String> inRDD)
        {
          inRDD.foreach(fn1)
          inRDD.foreach(fn2)
        }
 }

以这种方式运行流作业时,有何不同。以下功能是否在输入Dstream上并行运行?
DStreamRDD1.foreachRDD(fn1)
DStreamRDD2.foreachRDD(fn2)

最佳答案

foreach上的RDDforeachRDD上的DStream都将顺序运行,因为它们是输出转换,这意味着它们导致图形的实现。对于Spark中的任何常规惰性转换,情况并非如此,当执行图分成多个单独的阶段时,它们可以并行运行。

例如:

dStream: DStream[String] = ???
val first = dStream.filter(x => x.contains("h"))
val second = dStream.filter(x => !x.contains("h"))

first.print()
second.print()

当您有足够的群集资源来并行运行基础阶段时,第一部分不必按顺序执行。然后,再次调用count,这又是一个输出转换,将导致print语句一个接一个地打印。

07-28 02:32