spark内核揭秘-09-RDD的count操作 触发Job全生命周期-01

RDD源码的count方法:

从上面代码可以看出来,count方法触发SparkContext的runJob方法的调用:

进入 runJob(rdd, func, 0 until rdd.partitions.size, false)方法:

进一步跟踪runJob(rdd, (context: TaskContext, iter: Iterator[T]) => func(iter), partitions, allowLocal)方法:

继续跟踪进入runJob[T, U](rdd, func, partitions, allowLocal, (index, res) => results(index) = res)方法:

代码分析:

1、getCallSite :

2、clean(func):

3、dagScheduler.runJob(rdd, cleanedFunc, partitions, callSite, allowLocal, resultHandler, localProperties.get):

代码分析:

3.1、进入submitJob(rdd, func, partitions, callSite, allowLocal, resultHandler, properties):

上面代码分析:

3.1.1、 进入new JobWaiter(this, jobId, partitions.size, resultHandler)方法

3.1.2、进入eventProcessActor ! JobSubmitted( jobId, rdd, func2, partitions.toArray, allowLocal, callSite, waiter, properties)方法

我们可以看出来,是给自己发消息的

3.1.3、进入  dagScheduler.handleJobSubmitted(jobId, rdd, func, partitions, allowLocal, callSite,listener, properties)方法

首先构建finalStage,然后又一个getMissingParentsStages方法,可以发现运行有本地运行和集群运行两种模式,本地运行主要用于本地实验和调试:

3.1.3.1、进入  finalStage = newStage(finalRDD, partitions.size, None, jobId, callSite)方法:

3.1.3.2、进入 runLocally(job)方法:

3.1.3.2.1、 runLocallyWithinThread(job)方法:

3.1.3.3、进入 submitStage(finalStage)方法:

上面代码分析:submitStage第一次传入的参数是Job的最后一个Stage,然后判断一下是否缺失父Stage,如果没有依赖的parent Stage的话就可以submitMissingTasks运行,如果有parent Stage的话就要再一次submitStage做递归操作,最终会导致submitMissingTasks的调用:

3.1.3.3.1、进入  activeJobForStage(stage) 方法:

3.1.3.3.2、进入  getMissingParentStages(stage).sortBy(_.id) 方法:

跟进getShuffleMapState方法:

进入registerShuffleDependencies方法:

3.1.3.3.3、进入submitMissingTasks(stage, jobId.get) 方法:

PS:分析代码太多,下篇继续分析源码

时间: 2024-11-07 07:26:00

spark内核揭秘-09-RDD的count操作 触发Job全生命周期-01的相关文章

spark内核揭秘-09-RDD的count操作 触发Job全生命周期-02

接着上一篇文章继续分析代码: 3.1.3.3.3.1.进入TaskSet 方法: 3.1.3.3.3.2.进入taskScheduler.submitTasks(new TaskSet(tasks.toArray, stage.id, stage.newAttemptId(), stage.jobId, properties)) 方法: 从源代码中可以看出DAGScheduler中向TaskScheduler以Stage为单位提交任务,Stage是以TaskSet为单位的,构建一个TaskSet

Spark Streaming源码解读之流数据不断接收全生命周期彻底研究和思考

本期内容 : 数据接收架构设计模式 数据接收源码彻底研究 一.Spark Streaming数据接收设计模式   Spark Streaming接收数据也相似MVC架构: 1. Mode相当于Receiver存储数据,C级别的,Receiver是个抽象因为他有好多的Receiver 2. ReceiverSupervisor 是控制器,因为Receiver启动是靠ReceiverSuperior启动的,及接收到的数据交给ReceiverSuperior存储数据的 3. Driver会获得源数据,

(版本定制)第10课:Spark Streaming源码解读之流数据不断接收全生命周期彻底研究和思考

本期内容: 1.数据接收架构设计模式 2.数据接收源码彻底研究 1.Receiver接受数据的过程类似于MVC模式: Receiver,ReceiverSupervisor和Driver的关系相当于Model,Control,View,也就是MVC. Model就是Receiver,存储数据Control,就是ReceiverSupervisor,Driver是获得元数据,也就是View. 2.数据的位置信息会被封装到RDD里面. 3.Receiver接受数据,交给ReceiverSupervi

第10课:Spark Streaming源码解读之流数据不断接收全生命周期彻底研究和思考

上一课我们讲解了Receiver启动的流程.Receiver是通过ReceiverSupervisor的start方法启动的: /** Start the supervisor */ def start() {   onStart()   startReceiver() } 首先会调用ReceiverSupervisor的onStart()方法, override protected def onStart() {   registeredBlockGenerators.foreach { _.

Spark发行笔记8:解读Spark Streaming RDD的全生命周期

本节主要内容: 一.DStream与RDD关系的彻底的研究 二.StreamingRDD的生成彻底研究 Spark Streaming RDD思考三个关键的问题: RDD本身是基本对象,根据一定时间定时产生RDD的对象,随着时间的积累,不对其管理的话会导致内存会溢出,所以在BatchDuration时间内执行完RDD操作后,需对RDD进行管理. 1.DStream生成RDD的过程,DStream到底是怎么生成RDD的? 2.DStream和RDD到底什么关系? 3.运行之后怎么对RDD处理? 所

Spark Streaming源码解读之Receiver在Driver的精妙实现全生命周期彻底研究和思考

一:Receiver启动的方式设想 1. Spark Streaming通过Receiver持续不断的从外部数据源接收数据,并把数据汇报给Driver端,由此每个Batch Durations就可以根据汇报的数据生成不同的Job. 2. Receiver属于Spark Streaming应用程序启动阶段,那么我们找Receiver在哪里启动就应该去找Spark Streaming的启动. 3. Receivers和InputDStreams是一一对应的,默认情况下一般只有一个Receiver.

第9课:Spark Streaming源码解读之Receiver在Driver的精妙实现全生命周期彻底研究和思考

一:Receiver启动的方式设想 1. Spark Streaming通过Receiver持续不断的从外部数据源接收数据,并把数据汇报给Driver端,由此每个Batch Durations就可以根据汇报的数据生成不同的Job. 2. Receiver属于Spark Streaming应用程序启动阶段,那么我们找Receiver在哪里启动就应该去找Spark Streaming的启动. 3. Receivers和InputDStreams是一一对应的,默认情况下一般只有一个Receiver.

Spark 定制版:009~Spark Streaming源码解读之Receiver在Driver的精妙实现全生命周期彻底研究和思考

本讲内容: a. Receiver启动的方式设想 b. Receiver启动源码彻底分析 注:本讲内容基于Spark 1.6.1版本(在2016年5月来说是Spark最新版本)讲解. 上节回顾 上一讲中,我们给大家具体分析了RDD的物理生成和逻辑生成过程,彻底明白DStream和RDD之间的关系,及其内部其他有关类的具体依赖等信息: a. DStream是RDD的模板,其内部generatedRDDs 保存了每个BatchDuration时间生成的RDD对象实例.DStream的依赖构成了RDD

Spark发行版笔记10:Spark Streaming源码解读之流数据不断接收和全生命周期彻底研究和思考

本节的主要内容: 一.数据接受架构和设计模式 二.接受数据的源码解读 Spark Streaming不断持续的接收数据,具有Receiver的Spark 应用程序的考虑. Receiver和Driver在不同进程,Receiver接收数据后要不断给Deriver汇报. 因为Driver负责调度,Receiver接收的数据如果不汇报给Deriver,Deriver调度时不会把接收的数据计算入调度系统中(如:数据ID,Block分片). 思考Spark Streaming接收数据: 不断有循环器接收