【问题标题】:how to make two Spark RDD run parallel如何让两个 Spark RDD 并行运行
【发布时间】:2016-05-24 18:57:26
【问题描述】:

例如,我在代码中创建了两个 RDD,如下所示:

val rdd1=sc.esRDD("userIndex1/type1")
val rdd2=sc.esRDD("userIndex2/type2")
val rdd3=rdd1.join(rdd2)
rdd3.foreachPartition{....}

我发现它们是串行执行的,为什么 Spark 不并行运行它们呢? 我的问题的原因是网络很慢,生成 rdd1 需要 1 小时,生成 rdd2 也需要 1 小时。所以我问为什么Spark没有同时生成两个RDD。

【问题讨论】:

  • 您对这里有什么期望。这段代码实际上并没有做任何事情。如果您执行异步操作,则通常意味着没有足够的资源。
  • Spark 以您编写的方式执行您的代码。如果您想对一个 RDD 执行操作,该操作将产生另一个并与您的第二个 RDD 一起使用(例如加入),那么您的第二个 RDD 将等待前一个操作完成。

标签: apache-spark


【解决方案1】:

Spark 提供异步操作以异步运行所有作业,因此在您的用例中并行 + 并发运行所有计算可能会有所帮助。一次只会在 spark 集群中计算一个 RDD,但你可以使它们异步。你可以在这里查看这个api的java文档https://spark.apache.org/docs/2.0.0/api/java/org/apache/spark/rdd/AsyncRDDActions.html

还有一个关于它的博客在这里查看https://blog.knoldus.com/2015/10/21/demystifying-asynchronous-actions-in-spark/

【讨论】:

    【解决方案2】:

    我发现了类似的行为。由于您在 spark-submit 中设置的执行程序、执行程序核心的数量,以串行或并行方式运行 RDD 没有任何区别。

    假设我们有 2 个如上所述的 RDD。假设每个 RDD 需要 1 小时,每个 RDD 有 1 个执行器和 1 个核心。我们无法通过 1 个执行器和 1 个核心(Spark 配置)来提高性能,即使 Spark 并行运行两个 RDD,除非您增加执行器和核心。

    因此,并行运行两个 RDD 不会提高性能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-18
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 2012-12-05
      • 2019-01-01
      相关资源
      最近更新 更多