apache-spark - 什么决定了 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() 的地方,它将遍历决定作业数量的分区。但我没看懂那部分?究竟是什么决定了工作的数量?
解决方案
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
。
推荐阅读
- vue.js - Vuelidate & Tailwind:为什么我总是看到无效错误?
- html - 如何创建三行标签:middle/up + down
- c# - 关闭申请后申请流程未终止
- delphi - 使用 Direct2D 绘制阴影
- c - 1. 我是否正确释放内存?2. 在第二个 for 循环中发生了什么导致第一次迭代后打印出大量字符?
- python - 元素仅在手动单击页面 selenium python 时可用
- inno-setup - 如何在 Inno Setup 中仅将三部分文件版本(没有第四个修订号)包含到 AppVersion 值中
- php - 如果未选中选择选项,请将其从数据库中删除 - 引导多选
- sql - 从存储过程生成嵌套 JSON
- discord.py - Discord Bot 不能踢/禁止成员