2016-11-22 87 views
4

在以下代码中,似乎函数fn1 & fn2以顺序方式应用于inRDD,正如我在Spark Web UI的阶段部分中看到的。Spark DStream的foreachDD函数中RDD的并行转换

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) 
+0

都是顺序调用,它不是平行的。 – Shankar

回答

2

两个foreachRDDforeachRDDDStream将顺序运行,因为它们是输出变换,这意味着它们会导致图形的物化。对于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语句一个接一个地打印。

相关问题