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

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

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

【问题讨论】:

  • 非常好的问题。大多数情况下,对于复杂的查询,催化剂带来的痛苦多于收获。

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


【解决方案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] ...
      

      我希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2016-09-08
        • 2020-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-25
        • 2020-08-03
        • 2020-12-14
        • 2013-04-10
        相关资源
        最近更新 更多