禁用火花催化剂优化器

Posted

技术标签:

【中文标题】禁用火花催化剂优化器【英文标题】:Disable spark catalyst optimizer 【发布时间】:2018-10-20 11:26:38 【问题描述】:

为了提供一些背景知识,我尝试在使用和不使用 Spark 催化剂优化器的情况下在 Spark 上运行 TPCDS 基准测试。对于较小数据集的复杂查询,我们可能花费更多时间优化计划而不是实际执行计划。因此想要衡量优化器对查询整体执行的性能影响

有没有办法禁用部分或全部火花催化剂优化规则?

【问题讨论】:

非常好的问题。大多数情况下,对于复杂的查询,催化剂带来的痛苦多于收获。 【参考方案1】:

此功能已作为 Spark-2.4.0 的一部分添加到 SPARK-24802。

val OPTIMIZER_EXCLUDED_RULES = buildConf("spark.sql.optimizer.excludedRules")
    .doc("Configures a list of rules to be disabled in the optimizer, in which the rules are " +
      "specified by their rule names and separated by comma. It is not guaranteed that all the " +
      "rules in this configuration will eventually be excluded, as some rules are necessary " +
      "for correctness. The optimizer will log the rules that have indeed been excluded.")
    .stringConf
    .createOptional

您可以找到优化器规则列表here。 但理想情况下,我们不应该禁用规则,因为它们中的大多数都提供了性能优势。我们应该找出消耗时间的规则,检查是否对查询没有用处,然后禁用它们。

【讨论】:

【参考方案2】:

我知道这不是确切的答案,但它可以帮助你。

假设您的驱动程序不是多线程的。 (如果 Catalyst 很慢,提示优化?:))

如果您想测量在 Catalyst 中花费的时间,只需转到 Spark UI 并检查您的执行程序空闲了多少时间,或查看阶段/作业列表。

如果您有一个工作在 15:30 开始,持续时间为 30 秒,而下一个工作在 15:32 开始,这可能意味着催化剂需要 1:30 进行优化(假设没有完成繁重的驱动工作)。

或者更好的是,只需在调用 Spark 中的每个操作之前放置日志,然后检查在任务实际发送到执行程序之前经过了多少时间。

【讨论】:

【参考方案3】:

为了完成,我在这个拉取请求上问了SPARK-24802 怎么做,Takeshi Yamamuro 友好地回答:

scala> Seq("abc", "def").toDF("v").write.saveAsTable("t")
scala> sql("SELECT * FROM t WHERE v LIKE '%bc'").explain()
== Physical Plan ==
*(1) Project [v#18]
+- *(1) Filter (isnotnull(v#18) AND EndsWith(v#18, bc))
                                    ^^^^^^^^
   +- *(1) ColumnarToRow
      +- FileScan parquet default.t[v#18] ...

scala> sql("SET spark.sql.optimizer.excludedRules=org.apache.spark.sql.catalyst.optimizer.LikeSimplification")

scala> sql("SELECT * FROM t WHERE v LIKE '%bc'").explain()
== Physical Plan ==
*(1) Project [v#18]
+- *(1) Filter (isnotnull(v#18) AND v#18 LIKE %bc)
                                         ^^^^
   +- *(1) ColumnarToRow
      +- FileScan parquet default.t[v#18] ...

我希望这会有所帮助。

【讨论】:

以上是关于禁用火花催化剂优化器的主要内容,如果未能解决你的问题,请参考以下文章

如何在 spark-submit 之前触发催化剂优化器以减少执行时间?

NHibernate 2.1.2 - 如何禁用反射优化器

mysql hint优化器提示之使用force index 强制使用索引和指定禁用索引

Oracle 优化器动态统计(Dynamic Statistics)

奥迪失火识别禁用啥功能

如何使用催化剂在 ios 和 macOS 中弹出文档选择器