【问题标题】:Spark optimize "DataFrame.explain" / CatalystSpark优化“DataFrame.explain”/催化剂
【发布时间】:2020-01-05 00:45:03
【问题描述】:

我有一个复杂的软件,它可以执行非常复杂的 SQL 查询(当然不是查询,你知道的 Spark 计划)。

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

我正在尝试打破沿袭,但这似乎会导致性能下降,因为实际执行时间变长了。

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

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

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

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

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

谢谢!,

PS:该计划确实包含多个联合(

【问题讨论】:

  • 刚刚找到github.com/apache/spark/blob/master/sql/catalyst/src/main/scala/…,但欢迎提供更多内容:)
  • 尝试使用 ("spark.sql.optimizer.maxIterations") 到 30,没有效果 :(。还尝试禁用 CombineUnions 规则
  • 尝试禁用所有优化器规则,但仍需要 1.30 分钟:/。我将不得不启用更多日志记录:S
  • 我们如何禁用所有规则。有几件事可能导致速度变慢 1. metastore 调用来获取 tabe 信息 2) 如果持久存储是基于封闭的(S3 等),则需要 api 调用来创建列表文件,这是一个昂贵的操作
  • 我使用 spark.sql.optimizer.excludedRules 禁用了所有可禁用的规则(有些是强制性的)。存储只有 Hive 和 KUDU(主要是 Kudu)。 Metastore 调用可能是一个原因,是的,但我还有许多其他阶段,我使用几乎相同的表而没有问题。另外,时间是在我调用“count”之后,metastore 不应该在之前完成吗? (所以当我创建 DAF 时,Spark 可以知道它正在使用的列)

标签: apache-spark optimization internals catalyst-optimizer


【解决方案1】:

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

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

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

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

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)(使用驱动程序级并行/线程),缓存生成的 DataFrame,然后等待+然后执行 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

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

【讨论】:

  • 这是关于影响,为 Catalyst Optimizer 添加自己的规则吗?
  • 不,它正在修改用户(我的)代码以执行此操作。添加更多规则不会解决任何问题(特别是因为我不太了解优化器,以便知道哪个规则很慢以及如何在自定义规则中对其进行优化)
  • 自定义规则在我的书中相当于同一件事
  • 不确定,我的意思是我不太了解自定义规则,但是如果您的操作仅仅因为正在优化而需要 2 分钟才能开始,您是否可以通过使用自定义规则来部分启动计划?.我的意思是,我会理解自定义规则的工作类似于编译器,您可以改进计划的输出,但我希望计划执行的一部分与计划的实际计算快捷/重叠。
  • 我已经阅读了更多关于规则的内容(特别是关于自定义策略),虽然这有助于优化,但如果你想优化某些东西,它确实需要非常深入的 Catalyst 知识和我的问题一样大(+我不知道时间实际上“丢失”在哪里),但我看不到在优化时执行并行计算的方法(可能你可以并行执行,但在获得计划之前? ),或者至少不比我目前的方法努力/收益更好:S.
猜你喜欢
  • 2016-09-08
  • 1970-01-01
  • 2018-10-20
  • 1970-01-01
  • 1970-01-01
  • 2020-12-14
  • 2013-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多