如何在 spark-submit 之前触发催化剂优化器以减少执行时间?
Posted
技术标签:
【中文标题】如何在 spark-submit 之前触发催化剂优化器以减少执行时间?【英文标题】:How to trigger catalyst optimizer before spark-submit to reduce execution time? 【发布时间】:2020-09-15 05:32:36 【问题描述】:我所在的组织正在从他们旧的传统执行方式迁移到公共云。我们必须为在云上发生的所有处决付费。为了降低执行成本,我们正在做两件事:
-
我们正在努力避免所有错误的执行。
我们正在尝试进一步减少执行时间。
作为一名大数据工程师,我的工作主要依赖于 SparkSQL,我正在努力减少 SQL 查询的执行时间。催化剂在执行时做什么,我想在执行之前这样做。用于读取逻辑计划、优化逻辑计划和生成物理计划等。 我还想在催化剂中添加我的自定义优化计划,这也将在构建时触发。
在执行之前有什么办法可以做到这一切吗?
【问题讨论】:
【参考方案1】:您实际上可以通过创建数据框而不执行任何操作来获取查询的执行计划。
假设你有一个DataFrame df
,你可以访问df.logicalPlan
并遍历计划。如果您有一些启发式方法来检测它,这可能会满足您避免错误执行的第一个要求。
至于自定义优化,您可以添加自己的优化规则(参见https://www.waitingforcode.com/apache-spark-sql/introduction-custom-optimization-apache-spark-sql/read)。 这不会在构建时触发,而是在执行时触发(就像所有催化剂优化一样)
【讨论】:
顺便说一句,您也可以自己调用优化器:df.sparkSession().sessionState().optimizer().execute(df.logicalPlan());
我知道我们可以通过调用 explain() 方法在 spark 执行之前检查一个计划,但是催化剂做了很多事情,我想做它的所有步骤。例如,催化剂执行一些基于规则的转换在树上生成优化的逻辑计划。将逻辑计划转换为多个物理计划,然后使用最优化的物理计划。我们可以在执行之前完成所有这些,以便催化剂必须在运行时做一些工作以上是关于如何在 spark-submit 之前触发催化剂优化器以减少执行时间?的主要内容,如果未能解决你的问题,请参考以下文章