【问题标题】:Are two transformations on the same RDD executed in parallel in Apache Spark?Apache Spark 中是否并行执行同一 RDD 上的两个转换?
【发布时间】:2017-11-08 13:58:42
【问题描述】:

假设我们有以下 Scala 程序:

val inputRDD = sc.textFile("log.txt")
inputRDD.persist()

val errorsRDD = inputRDD.filter(lambda x: "error" in x)
val warningsRDD = inputRDD.filter(lambda x: "warning" in x)

println("Errors: " + errorsRDD.count() + ", Warnings: " + warningsRDD.count())

我们创建一个简单的 RDD,将其持久化,对 RDD 执行两次转换,最后得到一个使用 RDD 的操作。

调用 print 时,执行转换,每个转换当然是并行的,具体取决于集群管理。

我的主要问题是:这两个动作和转换是并行执行还是顺序执行?还是errorsRDD.count()先执行再warningsRDD.count(),依次执行?

我也想知道在这个例子中使用持久化是否有任何意义。

【问题讨论】:

    标签: scala apache-spark rdd


    【解决方案1】:

    所有标准 RDD 方法都是阻塞的(AsyncRDDActions 除外),因此将按顺序评估操作。可以使用非阻塞提交(线程,Futures)同时执行多个操作,并正确配置应用内调度程序或明确限制每个操作的资源。

    关于cache,不知道上下文是不可能回答的。根据集群配置、存储和数据位置,再次从磁盘加载数据可能会更便宜,尤其是在资源有限的情况下,后续操作可能会触发缓存清理。

    【讨论】:

    • 谢谢你的回答,把一切都说清楚了:) 没有上下文,但我完全理解现在坚持的目的,所以我明白你为什么没有明确的答案
    【解决方案2】:

    这将首先执行errorsRDD.count() 然后warningsRDD.count()。 这里使用persist的重点是当第一次count执行时,inputRDD会在内存中。 第二个计数,spark 不需要再次从存储中重新读取文件的“全部”内容,因此这个计数的执行时间会比第一个快得多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多