type
status
date
slug
summary
tags
category
icon
password
第三章 Spark SQL 执行全过程概述(上)
SQL转换的过程
对于 Spark SQL 系统,从 SQL 到 Spark RDD 的执行需要经过两个大的阶段,分别是逻辑计划(LogicalPlan)和物理计划(PhysicalPlan)
- 逻辑计划阶段
仅作为中间阶段,不会提交执行。经历三个子阶段:
1)对应未解析的逻辑算子树 UnresolvedLogicalPlan,仅仅是数据结构,不包含任何数据信息等
2)解析后的逻辑算子树 AnalyzedLogcalPlan,节点中绑定各种信息
3)优化后的逻辑算子树 optimizeLogcalPlan,应用各种优化规则对低效的逻辑计划进行转换
- 物理计划阶段
1) 生成物理算子树的列表 Iterator[Physicalplan],同样的逻辑算子树可能对应多个物理算子树
2)选取最优的物理算子树 SparkPlan
3)对选取的物理算子树进行提交前的准备工作,例如,确保分区操作正确、物理算子树节点重用、执行代码生成等,得到“准备后”的物理算子树 Prepared SparkPlan
上述整个转换过 Spark 集群 Driver 端进行,不涉及分布式环境。
举个实际的例子,查询年龄在 18 岁以上的学生名字的这条 SQL 的转换过程如下:
1)左上角是 SQL 语句,生成的逻辑算子树中有 Relation Filter 和 Project 节点,分别对应数据表、过滤逻辑(age l8)和列裁剪逻辑(只涉及 3 列中的 2 列)。
2)下一步的物理算子树从逻辑算子树一对一映射得到,Relation 转换为 FileSourceScanExec 执行节点,filter 逻辑节点转换为 FilterExec 执行节点,Project 逻辑节点转换为 ProjectExec 执行节点。
3)FileSourceScanExec 执行节点中需要构造数据源对应的 RDD, FilterExec 和 ProjectExec 中的 execute RDD 执行相应的 transformation 操作。
虽然实际生产中的 SQL 语句非常复杂,涉及的映射操作也比较烦琐,但总体上仍然遵循上述步骤。