Spark缓存功能:缓存作业和缓存阶段

时间:2018-08-20 22:19:11

标签: apache-spark

我是新手,可以在这里使用一些指导。 我们有一些基本代码可读取到csv中,将其缓存并输出到镶木地板中:

   1. val df=sparkSession.read.options(options).schema(schema).csv(path)
   2. val dfCached = df.withColumn()....orderBy(some Col).cache()
   3. dfCached.write.partitionBy(partitioning).parquet(outputPath)

AFAIK,一旦我们调用Parquet调用(一个动作),则应在执行该动作之前执行cache命令以保存DF的状态。

在spark用户界面中,我看到:

  1. 正在执行上述#2中的cache调用的单阶段作业
  2. 然后是一个正在执行parquet调用的作业。这项工作分为两个阶段。 1似乎在重复缓存步骤,第二个执行到拼花的转换。 (请参见下图)

为什么我同时拥有一个缓存作业和一个缓存阶段?我希望只有一个或另一个缓存,但似乎我们在这里缓存了两次。

2 jobs

parquet job stages

1 个答案:

答案 0 :(得分:0)

我不确定100%,但似乎正在发生以下情况:

  1. 加载csv数据时,它会在辅助节点之间分配。我们调用cache(),每个节点将接收到的数据存储在内存中。这是第一个缓存作业。

  2. 当我们调用partitionBy(...)时,需要根据传递给函数的args在不同的执行程序之间重新组合数据。由于我们正在缓存数据,并且数据已从一个执行程序转移到另一个执行程序,因此我们需要重新缓存重新整理的数据。可以确认是因为第二个缓存阶段显示了一些随机写入数据。此外,缓存阶段显示的任务要少于初始缓存任务。可能是因为只需要重新整理数据,而不是整个数据帧。

  3. 镶木地板阶段被调用。我们可以看到一些随机读取的数据,这些数据显示执行者正在读取新的随机数据。