Open teeyog opened 6 years ago
先介绍在Spark SQL中两个非常重要的数据结构:Tree和Rule。
SparkSql的第一件事就是把SQLText解析成语法树,这棵树包含了很多节点对象,节点可以有特定的数据类型,同时可以有0个或者多个子节点,节点在SparkSQL中的表现形式为TreeNode对象。举个实际的例子:
Add(left: TreeNode, right: TreeNode): 两个表达式的和
x + (1 + 2) 在代码中的表现形式为:Add(Attribute(x), Add(Literal(1), Literal(2)))
而Rule则是应用在Tree上的规则,通过模式匹配,匹配成功的就进行相应的规则变换,若不成功则继续匹配子节点,如在Optimizer模块中有个常量累加的优化规则,通过该规则,可以将两个常量节点直接转化为值相加后的一个常量节点,如下图: 可以看见先匹配第一个Add节点没有匹配成功,再匹配其子节点Add成功了。
下图便是SparkSql整个解析成RDD的流程图,红色部分便是SparkSql优化器系统Catalyst,和大多数大数据SQL处理引擎设计基本相同(Impala、Presto、Hive(Calcite)等)。下面简述一下每个组成部分都做了什么,后续博客中会进行详解。
通过优化后的LogicalPlan还只是逻辑上的,接下来需要通过SparkPlanner 将optimized LogicalPlan应用到一系列特定的Strategies上,即转化为可以直接操作真实数据的操作及数据和RDD的绑定等,此过程解析完后形成的AST为 PhysicalPlan。
此模块将 physical plan 转化为 executable physical plan,主要是插入 shuffle 操作和 internal row 的格式转换。
最后调用SparkPlan的execute()执行计算。每个SparkPlan里面都有execute的实现,一般都会递归调用children的execute()方法,最后便会触发整个Tree的计算。
最后上个流程图
后续会对每个模块进行详细解析。
预备知识
先介绍在Spark SQL中两个非常重要的数据结构:Tree和Rule。
SparkSql的第一件事就是把SQLText解析成语法树,这棵树包含了很多节点对象,节点可以有特定的数据类型,同时可以有0个或者多个子节点,节点在SparkSQL中的表现形式为TreeNode对象。举个实际的例子:
Add(left: TreeNode, right: TreeNode): 两个表达式的和
x + (1 + 2) 在代码中的表现形式为:Add(Attribute(x), Add(Literal(1), Literal(2)))
而Rule则是应用在Tree上的规则,通过模式匹配,匹配成功的就进行相应的规则变换,若不成功则继续匹配子节点,如在Optimizer模块中有个常量累加的优化规则,通过该规则,可以将两个常量节点直接转化为值相加后的一个常量节点,如下图: 可以看见先匹配第一个Add节点没有匹配成功,再匹配其子节点Add成功了。
总流程图
下图便是SparkSql整个解析成RDD的流程图,红色部分便是SparkSql优化器系统Catalyst,和大多数大数据SQL处理引擎设计基本相同(Impala、Presto、Hive(Calcite)等)。下面简述一下每个组成部分都做了什么,后续博客中会进行详解。
Parser
Analyzer
Optimizer
SparkPlanner
通过优化后的LogicalPlan还只是逻辑上的,接下来需要通过SparkPlanner 将optimized LogicalPlan应用到一系列特定的Strategies上,即转化为可以直接操作真实数据的操作及数据和RDD的绑定等,此过程解析完后形成的AST为 PhysicalPlan。
prepareForExecution
此模块将 physical plan 转化为 executable physical plan,主要是插入 shuffle 操作和 internal row 的格式转换。
execute
最后调用SparkPlan的execute()执行计算。每个SparkPlan里面都有execute的实现,一般都会递归调用children的execute()方法,最后便会触发整个Tree的计算。
最后上个流程图
后续会对每个模块进行详细解析。