Spark SQL原理解析(一)SQL解析框架Catalyst流程概述 (2)

catalyst流程

主要流程大概可以分为以下几步:

Sql语句经过Antlr4解析,生成Unresolved Logical Plan(有使用过Antlr4的童鞋肯定对这一过程不陌生)

analyzer与catalog进行绑定(catlog存储元数据),生成Logical Plan;

optimizer对Logical Plan优化,生成Optimized LogicalPlan;

SparkPlan将Optimized LogicalPlan转换成 Physical Plan;

prepareForExecution()将 Physical Plan 转换成 executed Physical Plan;

execute()执行可执行物理计划,得到RDD;

提前说一下吧,上述流程多数是在org.apache.spark.sql.execution.QueryExecution这个类里面,这个贴一下简单的代码,看看就好,先不多做深究。后面的文章会详细介绍这里的内容。

class QueryExecution(val sparkSession: SparkSession, val logical: LogicalPlan) { ......其他代码 //analyzer阶段 lazy val analyzed: LogicalPlan = { SparkSession.setActiveSession(sparkSession) sparkSession.sessionState.analyzer.executeAndCheck(logical) } //optimizer阶段 lazy val optimizedPlan: LogicalPlan = sparkSession.sessionState.optimizer.execute(withCachedData) //SparkPlan阶段 lazy val sparkPlan: SparkPlan = { SparkSession.setActiveSession(sparkSession) // TODO: We use next(), i.e. take the first plan returned by the planner, here for now, // but we will implement to choose the best plan. planner.plan(ReturnAnswer(optimizedPlan)).next() } //prepareForExecution阶段 // executedPlan should not be used to initialize any SparkPlan. It should be // only used for execution. lazy val executedPlan: SparkPlan = prepareForExecution(sparkPlan) //execute阶段 /** Internal version of the RDD. Avoids copies and has no schema */ lazy val toRdd: RDD[InternalRow] = executedPlan.execute() ......其他代码 }

值得一提的是每个阶段都使用了lazy懒加载,对这块感兴趣可以看看我之前的文章Scala函数式编程(六) 懒加载与Stream。

上述主要介绍Spark SQL模块内容,其出现的背景以及主要解决问题。而后简单介绍下Dataframe API的内容,以及Spark SQL解析SQL的内部框架Catalyst。后续主要会介绍Catalyst中各个步骤的流程,结合源码来做一些分析。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyywgp.html