0

我有一个复杂的软件,它执行非常复杂的 SQL 查询(不是查询,你知道的 Spark 计划)。<-- 计划是动态的,它们会根据用户输入而变化,因此我无法“缓存”它们。

我有一个阶段,其中 spark 需要 1.5-2 分钟来制定计划。为了确保,我添加了“logXXX”,然后是 explain(true),然后是“logYYY”,解释执行需要 1 分 20 秒。

我试图打破血统,但这似乎会导致性能下降,因为实际执行时间变得更长。

我不能并行化驱动程序的工作(已经做过,但是这个任务不能与其他任何事情重叠)。

关于如何改进 Spark 中的计划生成器的任何想法/指南?(例如,尝试启用/禁用的标志等等......)

有没有办法在 Spark 中缓存计划?(所以我可以并行运行它然后执行它)

我尝试禁用所有可能的优化器规则,将最小迭代次数设置为 30 ......但似乎没有任何影响具体点:S

我尝试禁用 wholeStageCodegen 并有所帮助,但执行时间更长:)。

谢谢!,

PS:该计划确实包含多个联合(<20,但每个联合内的计划非常复杂),这是造成时间的原因,但将它们分开也会影响执行时间。

4

1 回答 1

0

以防万一它可以帮助某人(如果没有人提供更多见解)。

因为我无法减少优化器时间(好吧,不确定减少优化器时间是否会好,因为我可能会失去执行时间)。

我计划的最新部分之一是扫描两个大表并从每个表中获取一列(使用窗口、聚合等......)。

所以我把我的代码分成两部分:

1- The big plan (cached)
2- The small plan which scans and aggregates two big tables (cached)

并添加了另一部分:

3- Left Join/enrich the big plan with the output of "2" (this takes like 10seconds, the dataset is not so big) and finish the remainder computation.

现在我并行启动两个动作(1,2)(使用驱动程序级并行/线程),缓存生成的数据帧,然后等待+然后执行 3。

有了这个,当 Spark 驱动程序(线程 1)正在计算大计划(约 2 分钟)时,执行程序将执行部分“2”(有一个小计划,但大扫描/洗牌),然后两者都像“混合”一样10-15 秒,与我在计算计划时节省的 1:30 相比,执行时间有了很好的改进。

比较时间:

在我有之前

1:30 Spark optimizing time + 6 minutes execution time

我现在有

max
(
1:30 Spark Optimizing time + 4 minutes execution time, 
0:02 Spark Optimizing time + 2 minutes execution time
) 
+ 15 seconds joining both parts

没那么多,但不少“昂贵”的人会等待它完成:)

于 2019-09-02T12:50:21.733 回答