Apache spark 是什么触发了Spark的工作?

Apache spark 是什么触发了Spark的工作?,apache-spark,Apache Spark,我正在学习Spark如何在Databricks中工作。我知道洗牌是如何在工作中造成阶段性的,但我不知道是什么导致了工作。我认为这种关系是一次行动一份工作,但有时每次行动都会有很多工作 例如 触发两个作业,一个用于查看模式,另一个用于执行.show 与.groupBy相同的代码 val initialDF = spark .read

我正在学习Spark如何在Databricks中工作。我知道洗牌是如何在工作中造成阶段性的,但我不知道是什么导致了工作。我认为这种关系是一次行动一份工作,但有时每次行动都会有很多工作

例如

触发两个作业,一个用于查看模式,另一个用于执行
.show

.groupBy
相同的代码

val initialDF = spark                                                       
  .read                                                                     
  .parquet("/mnt/training/wikipedia/pagecounts/staging_parquet_en_only_clean/")   

val someDF = initialDF
  .groupBy($"project").sum()

someDF.show
…触发了九项工作

.show
替换为
.count
.groupBy
版本触发两个作业,
.orderBy
版本触发三个作业


很抱歉,我无法共享数据,以使其可复制,但我希望能够理解抽象地创造就业机会的规则。很高兴分享
的结果。如果有帮助,请解释。

show
不带参数显示结果的前20行。
在数据集上触发
show
时,它会转换为
head(20)
操作,而head(20)
操作又会转换为
limit(20)
操作。
显示
->
头部
->
限制

关于
限制

Spark以增量方式执行
limit
,直到满足limit查询。
在第一次尝试中,它尝试从一个分区检索所需的行数。
如果未满足限制要求,则在第二次尝试中,它将尝试从4个分区检索所需的行数(由
spark.sql.limit.scaleUpFactor
,默认值4确定)。然后处理16个分区,依此类推,直到满足限制或数据耗尽

在每次尝试中,都会生成一个单独的作业


代码参考:

通常情况下,它是您所说的1:1。也就是说,1个动作产生1个作业,每个阶段有1..N个阶段,每个阶段有M个任务,并且可以跳过这些阶段

然而,一些行动引发了“水下”的额外工作。例如,pivot:如果只传递列作为参数,而不传递pivot的值,则Spark必须首先获取所有不同的值,以便生成列,执行collect,即一个额外作业


show也是生成额外作业的一种特殊情况。

这是@DaRkMaN,您能用
.count
.groupBy
进行评论吗(而不是像上面提到的那样
.show
?我们能检查是否生成了用于文件列表的作业吗(我相信这个操作会产生一个作业来并行化云存储列表),模式推断(设置spark.sql.hive.caseSensitiveInferenceMode=NEVER\u推断并检查作业是否减少)?我想这里更大的教训是,许多动作中都包含其他动作……因此,每个动作仍然只有一个作业,但并不总是每个动作都有一个作业。没有作业和动作的一对一映射。重读我之前写的,是的,这是一种令人困惑的说法,没有1-1映射。
val initialDF = spark                                                       
  .read                                                                     
  .parquet("/mnt/training/wikipedia/pagecounts/staging_parquet_en_only_clean/")   

val someDF = initialDF
  .groupBy($"project").sum()

someDF.show