spark2.2.0源码学习过程记录:Day10

本文详细解析了Apache Spark中DataSet的ofRows方法调用流程,从SparkSession到SessionState的executePlan方法,再到创建QueryExecution对象的过程。文章还介绍了如何进行逻辑计划分析、优化以及物理计划生成,并解释了RuleExecutor在不同阶段的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、读《apache spark 源码剖析》第七章第2节
接着昨天的来

2、源码学习
DataSet中的ofRows方法调用了sparkSession.sessionState.executePlan,返回一个QueryExecution对象

类SessionState
类注释A class that holds all session-specific state in a given [[SparkSession]].可以看出这个类是保存sparkSession的状态的
executePlan方法调用了createQueryExecution方法,再跟这个方法,发现是创建的时候传入的

看sparkSession创建SessionState的代码,是昨天看过的,最后发现是在BaseSessionStateBuilder中定义的,定义为:
/**
* Create a query execution object.
*/
protected def createQueryExecution: LogicalPlan => QueryExecution = { plan =>
new QueryExecution(session, plan)
}
所有后续的生成analyzed logical plan、optimized logical plan、physical plan的步骤都是在这个类中调用相关方法处理的

Analyze:
调用sparkSession.sessionState.analyzer.execute
调用到RuleExecutor的execute,其中batches比较重要,是每个RuleExecutor不一样的地方,比如analyzer有ResolveRelations、ResolveReferences等
我也看书中的例子ResolveRelations的apply方法如果发现是UnresolvedRelation则调用resolveRelation(u),在方法内调用了
val defaultDatabase = AnalysisContext.get.defaultDatabase
val relation = lookupTableFromCatalog(u, defaultDatabase)
可以看出是在找数据实际存放的地方

Optimize:
调用sparkSession.sessionState.optimizer.execute
其他基本一样,只是batches和analyze不一样

sparkPlan:
调用planner.plan(ReturnAnswer(optimizedPlan)).next()
这个调用到了QueryPlanner的plan方法,类似于之前analyze和optimize,这里有类似batches的strategies,定义在具体的实现类中,在这里具体的实现类是SparkPlanner,比如他包含了JoinSelection、JoinSelection等

最后两步
// executedPlan should not be used to initialize any SparkPlan. It should be
// only used for execution.
lazy val executedPlan: SparkPlan = prepareForExecution(sparkPlan)

/** Internal version of the RDD. Avoids copies and has no schema */
lazy val toRdd: RDD[InternalRow] = executedPlan.execute()


第一轮的spark源码学习到此为止了,有很多地方没深入看,有些地方没看懂,以后再补,通过这次找到了一个学习源码的好方法,非常开心
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值