0

我们正在执行一些测试来评估使用 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) 

分析数据流的第二个版本,由于所有转换都是惰性的,并且每个操作都重新执行(根据文档),因此在执行第二个计数时,它应该需要执行之前的两个转换(LOAD 和 SELECT ALL)。因此,我们预计在执行数据流的第二个版本时,时间约为 20 秒。但是,执行时间为 11 秒。显然,第一次计数所需的转换结果被 Spark 缓存用于第二次计数。

请问各位大佬知道怎么回事吗?

4

2 回答 2

1

看看你的工作,你可能会看到跳过的阶段,这是一件好事。Spark 认识到它仍然具有上一个作业的 shuffle 输出,并将重用它,而不是从源数据开始并重新调整整个数据集。

于 2016-12-09T14:02:27.663 回答
0

正是 Spark DAG 调度程序在从 Action 获取数据后重新确定了数据的未来用途。Spark 程序隐式地创建了操作的逻辑有向无环图 (DAG)。当驱动程序运行时,它将这个逻辑图转换为物理执行计划。

操作强制将 DAG 转换为执行计划

当您在 RDD 上调用操作时,必须对其进行计算。在您的情况下,您只是在执行一个操作,然后在此之上执行另一个操作。这也需要计算其父 RDD。Spark 的调度程序提交一个作业来计算所有需要的 RDD。该工作将具有一个或多个阶段,这些阶段是由任务组成的并行计算波。每个阶段将对应于 DAG 中的一个或多个 RDD。由于流水线,一个阶段可以对应多个 RDD。

火花可视化

有向无环图

于 2016-12-09T15:45:54.817 回答