我们正在执行一些测试,以评估使用Spark SQL中的Spark和动作的行为。在我们的测试中,首先,我们通过2个转换和1个操作来构想一个简单的数据流:
LOAD (result: df_1) > SELECT ALL FROM df_1 (result: df_2) > COUNT(df_2)
第一个数据流的执行时间为10秒。接下来,我们在数据流中添加了另一个操作:
LOAD (result: df_1) > SELECT ALL FROM df_1 (result: df_2) > COUNT(df_2) > COUNT(df_2)
分析数据流的第二版,因为所有转换都是懒惰的,并重新执行了每个操作(根据文档),在执行第二个计数时,应要求执行两个上一个上一个转换(加载并选择选择)全部)。因此,我们期望在执行第二个版本的数据流时,时间将大约20秒。但是,执行时间为11秒。显然,第一个计数所需的转换结果被SPARK缓存,以进行第二个计数。
请,你们知道发生了什么吗?
看一下您的工作,您可能会看到跳过阶段,这是一件好事。Spark认识到它仍然具有上一个作业的洗牌输出,并将重复使用它,而不是从源数据开始并重新换完整数据集。
它是Spark DAG调度程序,它重新固定在数据中从Action获取数据后将来会使用它。Spark Program隐含地创建了一个逻辑的有向无限图(DAG)。驱动程序运行,将此逻辑图转换为物理执行计划。
动作将DAG的武力翻译成执行计划
当您在RDD上调用操作时,必须计算出来。在您的情况下,您只是在做一个诉讼,然后在此操作之后进行另一个操作。这也需要计算其父级RDD。Spark的调度程序提交了一项工作,以计算所有需要的RDD。该作业将具有一个或多个阶段,这是由任务组成的平行计算波。每个阶段将对应于DAG中的一个或多个RDD。单个阶段可以对应于管道上的多个RDD。
火花可视化
dag