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