如何使两个Spark RDD并行运行

时间:2016-05-24 18:57:26

标签: apache-spark

例如,我在我的代码中创建了两个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。

2 个答案:

答案 0 :(得分:4)

Spark提供异步操作以异步方式运行所有作业,因此在使用case并行运行所有计算时可能会有所帮助。在一个时间只有一个RDD将在spark集群中计算,但是你可以使它们异步。你可以在https://spark.apache.org/docs/2.0.0/api/java/org/apache/spark/rdd/AsyncRDDActions.html

查看此api的java文档

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

答案 1 :(得分:0)

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

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

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