题目一: 分析一条 TPCDS SQL
分析一条 TPCDS SQL (请基于 Spark 3.1.1 版本解答)
SQL 从中任意选择一条:
https://github.com/apache/spark/tree/master/sql/core/src/test/resources/tpcds
(1)运行该 SQL ,如 q38 ,并截图该 SQL 的 SQL 执行图
(2)该 SQL 用到了哪些优化规则( optimizer rules )
(3)请各用不少于 200 字描述其中的两条优化规则
(1)帮助文档:如何运行该 SQL
1. 从 github 下载 TPCDS 数据生成器
>git clone https://github.com/maropu/spark-tpcds-datagen.git
>cd spark-tpcds-datagen
2. 下载 Spark3.1.1 到 spark tpcds datagen 目录并解压
>wget https://archive.apache.org/dist/spark/spark-3.1.1/spark 3.1.1-bin-hadoop2.7.tgz
>tar -zxvf spark 3.1.1-bin-hadoop2.7.tgz
3. 生成数据
mkdir -p tpcds-data-1g
>export SPARK_HOME=./spark-3.1.1-bin-hadoop2.7
>./bin/dudgen --output-location tpcds-data-1g
4. 下载三个 test jar 并放到当前目录
>wget
https://repo1.maven.org/maven2/org/apache/spark/spark catalyst_2.12/3.1.1/spark-catalyst_2.1
2 3.1.1-tests.jar
>wget
https://repo1.maven.org/maven2/org/apache/spark/spark core_2.12/3.1.1/spark-core_2.12-3.1.1-tests.jar
>wget
https://repo1.maven.org/maven2/org/apache/spark/spark sql_2.12/3.1.1/spark-sql_2.12-3.1.1-te
sts.jar
5. 执行 SQL
spark-submit --class
org.apache.spark.sql.execution.benchmark.TPCDSQueryBenchmark --jars
spark-core_2.12-3.1.1-tests.jar,spark-catalyst_2.12-3.1.1-tests.jar
spark-sql_2.12-3.1.1-tests.jar --data-location tpcds data-1g --query-filter "q73"
(2)执行结果:该 SQL 用到了如下优化规则,
org.apache.spark.sql.catalyst.optimizer.ColumnPruning
org.apache.spark.sql.catalyst.optimizer.ReplaceIntersectWithSemiJoin
org.apache.spark.sql.catalyst.optimizer.ReplaceDistinctWithAggregate
org.apache.spark.sql.catalyst.optimizer.ReorderJoin
org.apache.spark.sql.catalyst.optimizer.PushDownPredicates
org.apache.spark.sql.catalyst.optimizer.PushDownLeftSemiAntiJoin
org.apache.spark.sql.catalyst.optimizer.CollapseProject
org.apache.spark.sql.catalyst.optimizer.EliminateLimits
org.apache.spark.sql.catalyst.optimizer.ConstantFolding
org.apache.spark.sql.catalyst.optimizer.RemoveNoopOperators
org.apache.spark.sql.catalyst.optimizer.InferFiltersFromConstraints
org.apache.spark.sql.catalyst.optimizer.RewritePredicateSubquery
(3) 选择 PushDownPredicates 和 ReorderJoin 这两条规则
PushDownPredicates 这个规则通过其他的操作把 filter 操作下推到离数据源更近的地方,将计算转移至数据源端,减少 spark 加载和计算的数据量,但不是所有的操作都支持。
ReorderJoin 这个规则是对 Join 操作进行重新排列,有两种做法。一种是逻辑上的转换,即将在 where 中涉及到两个表关联或者 filter 的条件提前至相应的 join 操作中,减少参与 join 的数据量以及最终 join 结果的数据量。还有一种做法是基于成本的做法,通过启用成本优化器,以及对 join 的表进行统计,spark 会根据 join 的成本选择代价最小的 join 方式。
评论