【发布时间】:2020-01-05 00:45:03
【问题描述】:
我有一个复杂的软件,它可以执行非常复杂的 SQL 查询(当然不是查询,你知道的 Spark 计划)。
我有一个阶段,Spark 需要 1.5-2 分钟来制定计划。为了确保,我添加了“logXXX”,然后是 explain(true),然后是“logYYY”,解释执行需要 1 分 20 秒。
我正在尝试打破沿袭,但这似乎会导致性能下降,因为实际执行时间变长了。
我不能并行化驱动程序的工作(已经做过,但是这个任务不能与其他任何事情重叠)。
关于如何改进 Spark 中的计划生成器的任何想法/指南? (例如,尝试启用/禁用的标志等......)
有没有办法在 Spark 中缓存计划? (所以我可以并行运行,然后执行)
我尝试禁用所有可能的优化器规则,将最小迭代次数设置为 30...但似乎没有任何影响具体点:S
我尝试禁用 wholeStageCodegen 并有所帮助,但执行时间更长:)。
谢谢!,
PS:该计划确实包含多个联合(
【问题讨论】:
-
尝试使用 ("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