【问题标题】:Concurrent transformations on RDD in foreachDD function of Spark DStreamSpark DStream的foreachDD函数中RDD的并发转换
【发布时间】:2017-04-05 13:15:08
【问题描述】:

在下面的代码中,函数 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)

【问题讨论】:

  • 都是顺序调用,不是并行的。

标签: java apache-spark spark-streaming rdd dstream


【解决方案1】:

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 语句一个接一个地打印出来。

【讨论】:

    猜你喜欢
    • 2020-06-03
    • 2017-06-29
    • 1970-01-01
    • 2016-06-12
    • 2016-02-05
    • 2016-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多