2016-11-22 84 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語句一個接一個地打印。

相關問題