Spark架构师3-源码

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

4.创建任务调度TaskScheduler;

5.创建和启动DAGScheduler; ~1:47:00

6.TaskScheduler的启动; 1:57:00

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值