Apache spark 如果火花阶段已完成,是否进行了计算?

Apache spark 如果火花阶段已完成,是否进行了计算?,apache-spark,distributed-computing,Apache Spark,Distributed Computing,我正在Spark应用程序主控制台中查看我的工作,我可以实时看到Spark通过我的应用程序的DAG时各个阶段的完成。一切进展得相当快。有些阶段需要不到一秒钟的时间,其他阶段需要一两分钟 列表顶部的最后一个阶段是rdd.saveAsTextFile(路径,classOf[gzip代码])。这个阶段需要很长时间 据我所知,转换执行零次、一次或多次,具体取决于操作(如saveAsTextFile或count)所创建的执行计划 随着工作的进行,我可以在App Manager中看到执行计划。有些阶段不存在

我正在Spark应用程序主控制台中查看我的工作,我可以实时看到Spark通过我的应用程序的DAG时各个阶段的完成。一切进展得相当快。有些阶段需要不到一秒钟的时间,其他阶段需要一两分钟

列表顶部的最后一个阶段是
rdd.saveAsTextFile(路径,classOf[gzip代码])
。这个阶段需要很长时间

据我所知,转换执行零次、一次或多次,具体取决于操作(如
saveAsTextFile
count
)所创建的执行计划

随着工作的进行,我可以在App Manager中看到执行计划。有些阶段不存在。有些人不止一次出席。这是意料之中的。我可以实时看到每个阶段的进度(只要我一直按F5刷新页面)。执行时间大致与每个阶段的数据输入大小相称。因此,我确信App Manager向我展示的是实际转换的进度,而不是DAG上的一些元活动

因此,如果转换发生在这些阶段中的每一个阶段,那么为什么最后一个阶段——从EMR到S3的简单写入——如此缓慢


如果,正如我的同事所建议的,应用程序管理器中显示的转换阶段没有进行实际计算,那么它们在做什么,消耗了如此多的内存、CPU和时间?

我想真正的困惑在于:

转型成本低廉

转换是懒惰的(大多数情况下),但并不便宜。这意味着不会应用转换,除非有一个急切的子体(操作)依赖于它。它没有告诉你它的成本


一般来说,转换是实际工作发生的地方。与转换中执行的逻辑相比,输出操作(不包括存储/网络IO)通常比较便宜。

在Spark中,延迟评估是一个关键概念,如果您想使用Spark,最好熟悉这个概念

您看到的完成得太快的阶段不会进行任何重要的计算

If they are not doing actual computation, what are they doing?
他们正在更新DAG

当一个动作被触发时,Spark有机会咨询DAG以优化计算(如果没有惰性优化,这是不可能的)

更多信息,请阅读

此外,我认为你的同事急于给你一个答案,并错误地说:

transformation are cheap
真相在于:

Spark中的所有转换都是惰性的,因为它们不进行计算 他们的结果马上就出来了。相反,他们只记得 应用于某些基本数据集(例如文件)的转换。这个 仅当操作需要生成结果时,才会计算转换 返回到驱动程序

“便宜”这个词不合适

这就解释了为什么在一天结束时,你的最后阶段(实际上需要数据并触发动作)与其他任务相比是如此缓慢


我的意思是,你提到的每个阶段似乎都不会引发任何行动。因此,最后阶段必须考虑所有之前的阶段,并完成所有需要的工作,但请记住,以优化的Spark观点。

这也是我的理解。然而,尽管在EMR上运行,但写入S3阶段的速度非常慢。S3的速度通常非常慢,当然还有提交算法的问题。写入S3的速度很慢,因为提交算法使用重命名,这对于S3来说既慢又不可靠。如果您不使用“一致的EMR”,请担心输出损坏的可能性,而不是性能。谢谢。仍然让我困惑的是,stage是编译的Spark函数,它们调用我的编译函数。考虑到其中许多都需要几分钟才能完成,Spark只是在进行优化吗?还是有额外的工作要做?@Synesso我不明白这个问题。特别是第一行。例如,当App Manager显示一个阶段需要3分钟才能完成时,在这3分钟内发生了什么?只有优化?在那个阶段我会说@Synesso没有优化发生。应用变换时,DAG将相应更新。当这项工作完成后,阶段就完成了。当执行另一个应用操作的阶段时,Spark将检查DAG,以了解进展情况,并对其进行概述,然后对其进行优化。这是我最初的理解。我还是很困惑。也许我可以为这个问题添加一些代码。