我的管道有点复杂-pyspark需要20分钟来制定执行计划。因为我必须使用不同的数据帧(作为源)多次执行相同的管道,所以我想知道是否有任何选择可以避免每次构建执行计划?一次构建执行计划,然后将其与其他源数据一起重复使用?
答案 0 :(得分:2)
有一种方法可以解决您的问题,但这需要对Spark内部结构有深入的了解。火花计划仅仅是对象树。这些树由Spark不断变换。可以在Spark的“外部”“点击”并转换它们。在细节上有很多魔鬼,因此除非您非常需要这种方法,否则我不建议您使用这种方法。
在去那里之前,重要的是要查看其他选项,例如:
了解造成延迟的确切原因。在某些托管的计划表单中,例如Databricks,计划以JSON记录,以进行分析/调试。有时我们会看到30分钟以上的延迟,单个内核上的CPU固定为100%,而一个计划会生成数十兆的JSON并将其推送到网络上。确保您的情况不会发生这种情况。
根据您的工作流程,如果您必须同时使用多个数据源来执行此操作,请使用驱动程序侧并行性同时使用多个内核来分析/优化计划。如果您的作业在处理的减少阶段有任何偏差,这也将提高群集利用率。
研究Spark的分析/优化的好处,以查看是否可以引入analysis barriers来加快转换速度。
答案 1 :(得分:1)
这是不可能的,因为源DataFrame
影响了应用于计划的优化的执行。
答案 2 :(得分:1)
正如@EnzoBnl指出的那样,这是不可能的,因为Tungsten对对象应用了特定的优化。相反,您可以做的(如果可能的话,可以使用数据)是将大文件拆分为较小的块,这些块可以在多个输入数据帧之间共享,并在它们上使用persist()
或checkpoint()
。
具体来说,checkpoint
通过存储中点来缩短执行计划,但是无法重用。
参见
数据检查点-将生成的RDD保存到可靠的存储中。在某些状态转换中,这是必须的,这些转换将跨多个批次的数据进行合并。在此类转换中,生成的RDD依赖于先前批次的RDD,这导致依赖项链的长度随时间不断增加。为了避免恢复时间的无限增加(与依赖链成比例),有状态转换的中间RDD会定期检查点到可靠的存储(例如HDFS),以切断依赖链。