Spark DStream的foreachDD函数中关于RDD的并发转换

5
在下面的代码中,似乎函数fn1和fn2按顺序应用于inRDD,这一点可以从Spark Web UI的Stages部分看出。
 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)

两个调用是顺序执行的,而不是并行执行的。 - Shankar
1个回答

2

无论是在 RDD 上的 foreach 还是在 DStream 上的 foreachRDD,它们都是输出转换(output transformations),意味着它们会导致图形的实体化,因此它们将按顺序运行。对于 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 语句依次打印。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接