禁用火花催化剂优化器

时间:2018-05-10 08:32:59

标签: apache-spark optimization apache-spark-sql spark-dataframe query-optimization

为了给出一些背景知识,我试图在Spark上运行TPCDS基准测试,无论是否有Spark的催化剂优化器。对于较小数据集的复杂查询,我们可能花费更多时间来优化计划而不是实际执行计划。因此,想要衡量优化器对查询整体执行的性能影响

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

3 个答案:

答案 0 :(得分:0)

此功能已在SPARK-24802的Spark-2.4.0中添加。

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的列表。
但理想情况下,我们不应该禁用规则,因为它们中的大多数都能提供性能优势。我们应该确定消耗时间的规则,并检查是否对查询没有用,然后将其禁用。

答案 1 :(得分:0)

我知道这不是确切答案,但可以为您提供帮助。

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

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

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

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

答案 2 :(得分:0)

仅需完成,我就这个拉取请求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] ...

我希望这会有所帮助。