Apache spark 在spark中,是否可以重用数据帧';s将其应用于不同数据源的执行计划

Apache spark 在spark中,是否可以重用数据帧';s将其应用于不同数据源的执行计划,apache-spark,pyspark,Apache Spark,Pyspark,我有一个有点复杂的管道-pyspark,它需要20分钟来制定执行计划。由于我必须使用不同的数据帧(作为源)多次执行同一管道,我想知道是否有任何选项可以避免每次构建执行计划?一次生成执行计划并将其与不同的源数据重用?`这是不可能的,因为源数据帧影响应用于计划的优化的执行。正如@EnzoBnl所指出的,这是不可能的,因为钨应用了特定于对象的优化。相反,您可以做的是(如果数据可能的话)将您的大文件分割成更小的块,这些块可以在多个输入数据帧之间共享,并对它们使用persist()或checkpoint(

我有一个有点复杂的管道-pyspark,它需要20分钟来制定执行计划。由于我必须使用不同的数据帧(作为源)多次执行同一管道,我想知道是否有任何选项可以避免每次构建执行计划?一次生成执行计划并将其与不同的源数据重用?`

这是不可能的,因为源数据帧影响应用于计划的优化的执行。

正如@EnzoBnl所指出的,这是不可能的,因为钨应用了特定于对象的优化。相反,您可以做的是(如果数据可能的话)将您的大文件分割成更小的块,这些块可以在多个输入数据帧之间共享,并对它们使用
persist()
checkpoint()
。 具体地说,
checkpoint
通过存储一个中间点来缩短执行计划,但无法重用。 看

数据检查点-将生成的RDD保存到可靠的存储中。在一些跨多个批处理组合数据的有状态转换中,这是必需的。在这种转换中,生成的RDD依赖于以前批处理的RDD,这导致依赖链的长度随着时间的推移而不断增加。为了避免恢复时间的无限增长(与依赖链成比例),有状态转换的中间RDD定期检查到可靠存储(例如HDF),以切断依赖链


有一种方法可以满足您的要求,但它需要对Spark内部结构的深入理解。星火计划只是对象的树。这些树不断地被火花改变。它们可以在火花的“外部”被“敲打”和转化。细节中有很多魔鬼,因此我不推荐这种方法,除非你有强烈的需求

在去那里之前,重要的是查看其他选项,例如:

  • 了解到底是什么导致了延迟。在一些托管的planforms上,例如DataRick,出于分析/调试目的,计划被记录在JSON中。我们有时会看到单核上CPU的延迟超过30分钟,而一个计划会产生数十兆字节的JSON并将其推送到网络上。确保在你的情况下不会发生类似的事情

  • 根据您的工作流程,如果必须同时对多个数据源执行此操作,请使用驱动程序端并行性同时使用多个核心分析/优化计划。如果您的作业在reduce处理阶段有任何偏差,这也将提高集群利用率

  • 调查Spark分析/优化的好处,看看是否可以引入加速转换