为了给出一些背景知识,我试图在Spark上运行TPCDS基准测试,无论是否有Spark的催化剂优化器。对于较小数据集的复杂查询,我们可能花费更多时间来优化计划而不是实际执行计划。因此,想要衡量优化器对查询整体执行的性能影响
有没有办法禁用部分或全部火花催化剂优化规则?
答案 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] ...
我希望这会有所帮助。