繁体   English   中英

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

[英]In spark, is it possible to reuse a DataFrame's execution plan to apply it to different data sources

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

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

在您出现 go 之前,请务必查看其他选项,例如:

  1. 了解究竟是什么导致了延迟。 在某些托管计划表(例如 Databricks)上,计划会记录在 JSON 中以用于分析/调试目的。 我们有时会看到 30 多分钟的延迟,其中 CPU 在单核上固定为 100%,而计划产生数十兆字节的 JSON 并将它们推送到线上。 确保在您的情况下不会发生这样的事情。

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

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

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

正如@EnzoBnl 指出的那样,这是不可能的,因为 Tungsten 应用了特定于 object 的优化。 你可以做的(如果可能的话)将你的大文件分割成更小的块,这些块可以在多个输入数据帧之间共享,并在它们上使用persist()checkpoint() 特别是checkpoint通过存储一个中点使执行计划更短,但是没有办法重用。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM