Java Spark数据流foreachDD函数中RDD的并发转换
在下面的代码中,函数fn1和fn2似乎以顺序的方式应用于inRDD,正如我在Spark Web UI的Stages部分中看到的那样Java Spark数据流foreachDD函数中RDD的并发转换,java,apache-spark,spark-streaming,rdd,dstream,Java,Apache Spark,Spark Streaming,Rdd,Dstream,在下面的代码中,函数fn1和fn2似乎以顺序的方式应用于inRDD,正如我在Spark Web UI的Stages部分中看到的那样 DstreamRDD1.foreachRDD(new VoidFunction<JavaRDD<String>>() { public void call(JavaRDD<String> inRDD) { inRDD.foreach(fn1) inRDD.fo
DstreamRDD1.foreachRDD(new VoidFunction<JavaRDD<String>>()
{
public void call(JavaRDD<String> inRDD)
{
inRDD.foreach(fn1)
inRDD.foreach(fn2)
}
}
RDD
上的foreach
和DStream
上的foreachRDD
都将按顺序运行,因为它们是输出转换,这意味着它们会导致图形的具体化。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
语句一个接一个地被打印出来。两者都是顺序调用,不是并行的。
dStream: DStream[String] = ???
val first = dStream.filter(x => x.contains("h"))
val second = dStream.filter(x => !x.contains("h"))
first.print()
second.print()