1、上次总结 0:18:00~ 0:41:00
1、Spark RPC(Endpoint:DriverEndpoint ClientEndpoint)
2、利用 akka(endpoint类似于actor) 模拟实现 YARN(Flink 就是基于 akka实现的 RPC)
3、Spark Standalone 集群启动脚本start-all.sh 分析
4、Master 启动分析
5、Worker 启动分析
6、Spark APP 提交脚本 spark-submit 脚本分析
7、SparkSubmit 分析(重点是进入main方法,通过反射的方式运行用户编写的application的主类main方法)
8、SparkContext 初始化
2、 本次内容概述
1、Spark Application 提交流程分析
2、Spark Application 的 DAG 生成和 Stage 切分分析
3、Spark 的 Task 分发和执行源码分析
4、Spark 的 Shuffle 机制源码分析
SparkContext 类构造函数:
/**
* TODO_MA 马中华 https://blog.csdn.net/zhongqi2513
* 注释:SparkContex 初始化从这儿开始
*/
try {
_conf = config.clone()
_conf.validateSettings()
/**
* TODO_MA 马中华 https://blog.csdn.net/zhongqi2513
* 注释:第一步
* 创建 Spark 执行环境 SparkEnv
* 除了创建 sparkEnv之外,还创建了各种 manager 对象。
*/
// Create the Spark execution environment (cache, map output tracker, etc)
_env = createSparkEnv(_conf, isLocal, listenerBus)
SparkEnv.set(_env)
/**
* TODO_MA 马中华 https://blog.csdn.net/zhongqi2513
* 注释:第二步
* 创建并初始化Spark UI
*/
_ui = if (conf.getBoolean("spark.ui.enabled", true)) {
// TODO_MA 注释:_jobProgressListener跟踪要在UI中显示的任务级别信息,startTime就是SparkContext的初始时的系统时间
// TODO_MA 注释:返回SparkUI,它的父类是WebUI,和MasterWebUI是一个级别的
Some(SparkUI.create(Some(this), _statusStore, _conf, _env.securityManager, appName, "", startTime))
}
/**
* TODO_MA 马中华 https://blog.csdn.net/zhongqi2513
* 注释:第三步
* hadoop相关配置以及Executor环境变量的设置
*/
_hadoopConfiguration = SparkHadoopUtil.get.newConfiguration(_conf)
/**
* TODO_MA 马中华 https://blog.csdn.net/zhongqi2513
* 注释: 第四步:创建心跳接收器
* 1、我们需要在“createTaskScheduler”之前注册“HeartbeatReceiver”,因为Executor将在构造函数中检索“HeartbeatReceiver”
* 2、创建一个HeartbeatReceiver 的RpcEndpoint注册到RpcEnv中,每分钟给自己发送ExpireDeadHosts,去检测Executor是否存在心跳,
* 3、如果当前时间减去最一次心跳时间,大于1分钟,就会用CoarseGrainedSchedulerBackend将Executor杀死
*/
// We need to register "HeartbeatReceiver" before "createTaskScheduler" because Executor will
// retrieve "HeartbeatReceiver" in the constructor. (SPARK-6640)
_heartbeatReceiver = env.rpcEnv.setupEndpoint(HeartbeatReceiver.ENDPOINT_NAME, new HeartbeatReceiver(this))
/**
* TODO_MA 马中华 https://blog.csdn.net/zhongqi2513
* 注释:第五步:创建任务调度TaskScheduler
* 如果集群管理器是standalone模式:该方法返回(StandaloneSchedulerBackend,TaskSchedulerImpl)
*/
// Create and start the scheduler
val (sched, ts) = SparkContext.createTaskScheduler(this, master, deployMode)
_schedulerBackend = sched
_taskScheduler = ts
启动明细: SparkContext 类createTaskScheduler方法
重点关注对象:
1、TaskScheduler, 实现类是 : TaskSchdulerImpl
2、DagScheduler
DAGSchedulerEventProcessLoop 初始化和启动两件事
3、SchdulerBackEnd
backend.start()
有两个成员变量:
1、负责和 worker 通信: DriverEndpoint
2、负责和 master 通信: StandaloneAppClient
封装了 ClientEndpoint