首页 > 解决方案 > 什么决定了 Spark 应用程序中的作业数量

问题描述

以前我的理解是,一个动作将在 Spark 应用程序中创建一个工作。但是让我们看看下面的场景,我只是使用 .range() 方法创建一个数据框

df=spark.range(10)

由于我的 spark.default.parallelism 为 10,因此生成的数据帧有 10 个分区。现在我只是在数据帧上执行 .show() 和 .count() 动作

df.show()
df.count()

现在,当我检查 spark 历史记录时,我可以看到 .show() 的 3 个作业和 .count() 的 1 个作业

在此处输入图像描述

为什么 .show() 方法有 3 个工作?

我读过一些 .show() 最终会在内部调用 .take() 的地方,它将遍历决定作业数量的分区。但我没看懂那部分?究竟是什么决定了工作的数量?

标签: apache-sparkpyspark

解决方案


StackOverflow 上已经多次提出类似的问题。例如:

阅读源代码后,其背后的原因非常明显Spark

背景知识RDD是Spark的基础数据结构,所以Dataset(和)在运行时Dataframe也会用到API 。RDD

调用堆栈是:show()方法将调用showString(),和showString()-> getRows()-> take(n)-> head(n)。最后,它将导致 RDD 的take(n).

while (buf.size < num && partsScanned < totalParts) {
        ...
        val res = sc.runJob(this, (it: Iterator[T]) => it.take(left).toArray, p)
        res.foreach(buf ++= _.take(num - buf.size))
        partsScanned += p.size
}

默认情况下,有 12 个分区,根据参数n,可能有多个由 启动的作业take


推荐阅读