Spark DStream 的 foreachDD 函数中 RDD 的并发转换
Concurrent transformations on RDD in foreachDD function of Spark DStream
在下面的代码中,函数 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)
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
语句一个接一个地打印出来。
在下面的代码中,函数 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)
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
语句一个接一个地打印出来。