Spark SQL自适应执行优化引擎(Adaptive Query Execution,简称AQE)应运而生,它可以根据执行过程中的中间数据优化后续执行,从而提高整体执行效率。核心在于:通过在运行时对查询执行计划进行优化,允许Spark Planner在运行时执行可选的执行计划,这些计划将基于运行时统计数据进行优化,从而提升性能。 AQE完全基于精确的运行时统计...
这里的planner是org.apache.spark.sql.execution.SparkPlanner这个类,而这个类继承自org.apache.spark.sql.catalyst.planning.QueryPlanner,plan()方法也是在父类QueryPlanner中实现的。和RuleExecution类似,QueryPlanner中有一个返回Seq[GenericStrategy[PhysicalPlan]]的方法:def strategies: Seq[GenericStrategy[PhysicalPlan...
Spark SQL主要由Catalyst优化、Spark SQL内核、Hive支持三部分组成。 (1)Catalyst优化 处理查询语句的整个过程,包括解析、绑定、优化、物理计划等,主要由关系代数(relation algebra)、表达式(expression)以及查询优化(query optimization)组成。 (2)Spark SQL内核 处理数据的输入输出,从不同的数据源(结构化数据Parquet文件...
Adaptive Query Execution(AQE)是英特尔大数据技术团队和百度大数据基础架构部工程师在Spark 社区版本的基础上,改进并实现的自适应执行引擎。近些年来,Spark SQL 一直在针对CBO 特性进行优化,而且做得十分成功。 CBO基本原理 首先,我们先来介绍另一个基于规则优化(Rule-Based Optimization,简称RBO)的优化器,这是一种...
2023-01-012023-01-032023-01-052023-01-072023-01-092023-01-112023-01-132023-01-152023-01-172023-01-192023-01-21Read Sales DataRead Product DataMerge DataPartition DataBroadcast JoinExecute SQL QueryData ReadingData ProcessingData QueryingSpark SQL Optimization Gantt Chart ...
之前介绍在sparksession实例化的是会实例化sessionState,进而确定QueryExecution、Analyzer,Optimizer也是在这一步确定的: 1 2 3 4 5 6 protecteddefoptimizer:Optimizer={ newSparkOptimizer(catalog, experimentalMethods) { overridedefextendedOperatorOptimizationRules:Seq[Rule[LogicalPlan]]= ...
Spark SQL 参数表(spark-2.3.2) key value meaning spark.sql.adaptive.enabled TRUE When true, enable adaptive query execution. spark.sql.adaptive.shuffle.targetPostShuffleInputSize 67108864b The target post-shuffle input size in bytes of a task. ...
Query Optimization Spark SQL’s Catalyst Optimizer handles logical optimization and physical planning, supporting both rule-based and cost-based optimization. When possible, Spark SQL Whole-Stage Java Code Generation optimizes CPU usage by generating a single optimized function in bytecode for the set...
def sql(sqlText: String): DataFrame = withActive { val tracker = new QueryPlanningTracker ...
val df = Seq((1, 1)).toDF("key", "value") df.createOrReplaceTempView("src") val queryCaseWhen = sql("select key from src ") 然后在Optimization优化阶段后,变成了: Project [_1#2 AS key#5] +- LocalRelation [_1#2, _2#3] 好吧,看起来没什么变化,与Analysis阶段相比,也就少了个Sub...