我们正在执行一些测试,以评估Spark和Spark SQL中的转换和操作的行为。在我们的测试中,首先我们设想一个具有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为第二次计数缓存了第一次计数所需的转换结果。
你们知道发生了什么吗?
发布于 2016-12-09 22:02:28
看看你的工作,你可能会看到跳过的阶段,这是一件好事。Spark认识到它仍然拥有前一个作业的随机输出,并将重用它,而不是从源数据开始并重新洗牌整个数据集。
发布于 2016-12-09 23:45:55
Spark程序隐式地创建驱动程序运行的operations.When的逻辑有向无环图,并将该逻辑图转换为物理执行计划。
操作强制将DAG转换为执行计划
当你在一个RDD上调用一个action时,它必须是computed.In你的情况,你只是在做一个action,然后在上面做另一个action。这也需要计算其父RDDs。Spark的调度器提交一个作业来计算所有需要的RDDs。该作业将有一个或多个阶段,这些阶段是由任务组成的并行计算波。每个阶段将对应于DAG中的一个或多个RDD。由于流水线,单个级可以对应于多个RDDs。
https://stackoverflow.com/questions/41059397
复制相似问题