是什么导致Spark中的工作?

时间:2019-05-14 21:56:58

标签: apache-spark databricks

我正在学习Spark在Databricks内部的工作方式。我了解改组是如何导致工作阶段的,但我不了解是什么原因导致了工作。我以为这种关系是每个动作一项工作,但是有时候每个动作发生很多工作。

例如

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

val someDF = initialDF
   .orderBy($"project")

someDF.show

触发两项工作,一项是查看架构,另一项是执行.show

并使用与.groupBy相同的代码

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

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

someDF.show

...触发9个工作。

.show代替.count.groupBy版本触发两个作业,而.orderBy版本触发三个作业。

对不起,我无法共享数据以使其具有可重复性,但我希望了解抽象创建作业的规则。如果有帮助,很高兴分享.explain的结果。

2 个答案:

答案 0 :(得分:1)

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

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

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

代码参考:https://github.com/apache/spark/blob/master/sql/core/src/main/scala/org/apache/spark/sql/execution/SparkPlan.scala#L365

答案 1 :(得分:0)

通常您声明为1:1。也就是说, 1个操作会导致具有1..N个阶段的 1个作业,每个阶段有M个任务,并且可以跳过多个阶段。

但是,某些操作会在“水下”触发额外的作业。例如。 数据点:如果仅传递列作为参数,而不传递数据点的值,则Spark必须先获取所有不同的值,以生成列,然后执行收集,即额外的工作

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