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



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

有一种方法可以满足您的要求,但它需要对Spark内部有深入的了解。Spark计划只是对象树。这些树不断被星火改造。它们可以在Spark的"外部"进行"挖掘"和转换。细节中有很多魔鬼,因此我不推荐这种方法,除非你有严重的需求。

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

  1. 了解延迟的确切原因。在一些托管的计划表单上,例如Databricks,出于分析/调试目的,计划被记录在JSON中。我们有时会看到30多分钟的延迟,CPU在单个内核上固定为100%,而一个计划会产生几十兆字节的JSON并将其推送到网络上。确保这样的事情不会发生在你的情况下。

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

  3. 调查Spark分析/优化的好处,看看是否可以引入分析障碍来加快转换。

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

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

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

最新更新