本文以Spark1.1.0版本为基础。

经过前一段时间的学习,基本上能够对Spark的工作流程有一个了解,但是具体的细节还是需要阅读源码,而且后续的科研过程中也肯定要修改源码的,所以最近开始Spark的源码的学习。首先以重要文件为基础分别分析,然后再整体的分析。

(一)DAGScheduler.scala文件的主要功能

DAGScheduler是划分Job为stage的调度,它是在作业所需要的数据已经被分为RDD之后执行的。DAGScheduler将Job划分为DAG图,以stage为图的结点,明确了各个stage之间的依赖关系,然后依次提交stage和Job。

(二)DAGScheduler.scala中的类和方法

1、initializeEventProcessActor()

该方法初始化eventProcessActor,也就是说,它可以阻塞线程直到supervisor启动,而在这整个过程中eventProcessActor都不会空闲。

2、executorHeartbeatReceived(execId,taskMetrics,blockManagerId)

该方法有三个参数,是用来接收心跳信息的。心跳信息是各个节点向master提供当前状态的,通知master当前节点是正在运行任务的,而运行任务的单位正是executor。

关于executor的方法还有:executorLost()处理executor执行失败,executorAdd()处理executor添加和tasksetFailed()设置任务失败。

3、getcacheLocs(RDD[_])

该方法查询本地缓存,检查本地存在哪些RDD,RDD的本地性是关系到stage分配的重要因素,在后文的函数中会实现。

关于Cache的方法还有:clearcacheLocs()清除缓存。

4、getShuffleMapStage(ShuffleDependence[_,_,_],JobId)

该方法是stage建立的关键,它明确stage的建立方法是以shuffle为边界的,如果出现wide依赖关系,那么就是shuffle的边界,就可以建立新的stage了,建立stage的方法为newOrUsedStage。

5、newStage(RDD[_],numTask,shuffleDependence,JobId,callsite)和newOrUsedStage(RDD[_],numTask,shuffleDependence,JobId,callsite)

这两个方法以同样的参数建立Stage,不同的是前者是建立无依赖关系的stage,而后者是由父系stage建立的有一定依赖关系的stage。

6、getParentStage(RDD[_],JobId)

该方法根据参数中的RDD数组(也就是一个stage中的所有RDD),查询当前RDD所属的Stage。

7、registerShuffleDependencies(shuffleDependencies[_,_,_],JobId)

该方法扫描依赖关系,利用getAncestorShuffleDependencies返回的RDD关系栈将依赖关系加入到Stage中。

8、getAncestorShuffleDependencies(RDD[_])

该方法建立RDD之间的依赖关系。

9、getMissingParentStages(stage)

该方法在getShuffleMapStage的基础上确定Stage的父系Stage,利用的也是RDD之间的依赖关系。

10、updataJobIdStageIdMaps(JobId,stage)

该方法用来更新Stage中的StageId和JobId。

11、cleanupStateForJobAndIndependentStages(Job)

该方法清除一个活动的Job的所有状态,以及其所属的不再需要的stage的状态。

12、submit[T,U](RDD[T],func,partitions,callsite,allowlocal,resulthandler,properties)

向任务调度器提交一个Job,并同时差生一个Jobwaiter,这个Jobwaiter可以用来保证Job执行时其他Job是阻塞的,也可以用来取消Job。

13、runJob[T,U](RDD[T],func,partitions,callsite,allowlocal,resulthandler,properties)

这个方法其实只是对Job提交之后的一个返回信息的处理,如果submitJob方法没有返回异常,就表示执行正确了,否则报错并加入日志。

14、runApproxiateJob[T,U,R](RDD[T],func,partitions,evaluator,callsite,timeout,properties)

该方法执行当前Job的下一个Job。

15、取消任务或者Stage的相关方法:doCancelAllJobs(),cancelStage(stageId)

16、重新提交失败的或者等待的Stage的方法:resubmitFailedStages(),submitWaitingStages()

17、runLocally(Job)和runLocallyWithinThread(job)

前者建立新的线程,启动本地执行;后者在线程中实际执行Job。

18、handle***()

这一些以handle开头的方法特点是进行了多次判定。handleJobSubmitted()方法对已经提交的Job进行操作,找到最后一个的Stage,检查Job执行的本地性等,然后将Job中的最后一个Stage提交,提交方法为submitStage()。submitStage()会根据最后一个Stage依次提交父系Stage,这其中需要考虑到丢失的task。handleTaskCompletion()方法在于处理Task执行后的各种状况,失败、阻塞或者失去联系,重新提交Task。详细的代码涉及诸多方法和类。

19、getPreferredLocsInternal(RDD,partition,visited)

根据Cache和输入RDD的位置和依赖关系递归查询最适合的位置。

Spark源码学习1.1——DAGScheduler.scala的更多相关文章

  1. Spark源码学习1.2——TaskSchedulerImpl.scala

    许久没有写博客了,没有太多时间,最近陆续将Spark源码的一些阅读笔记传上,接下来要修改Spark源码了. 这个类继承于TaskScheduler类,重载了TaskScheduler中的大部分方法,是 ...

  2. Spark源码学习1.6——Executor.scala

    Executor.scala 一.Executor类 首先判断本地性,获取slaves的host name(不是IP或者host: port),匹配运行环境为集群或者本地.如果不是本地执行,需要启动一 ...

  3. Spark源码学习1.3——TaskSetManager.scala

    TaskSetManager.scala TaskSet是指一系列被提交的task,一般是代表特定的stage中丢失的partition.TaskSetManager通过一个TaskScheduler ...

  4. Spark源码学习1.8——ShuffleBlockManager.scala

    shuffleBlockManager继承于Logging,参数为blockManager和shuffleManager.shuffle文件有三个特性:shuffleId,整个shuffle stag ...

  5. Spark源码学习1.5——BlockManager.scala

    一.BlockResult类 该类用来表示返回的匹配的block及其相关的参数.共有三个参数: data:Iterator [Any]. readMethod: DataReadMethod.Valu ...

  6. Spark源码学习1.4——MapOutputTracker.scala

    相关类:MapOutputTrackerMessage,GetMapOutputStatuses extends MapPutputTrackerMessage,StopMapOutputTracke ...

  7. Spark源码学习1.7——Master.scala

    master第一步是加载系统定义的环境变量,如worker的超时时间.系统保留的Application数目等:第二步,加载worker的信 息,地址.id等:第三步,加载Application的信息, ...

  8. Spark源码学习2

    转自:http://www.cnblogs.com/hseagle/p/3673123.html 在源码阅读时,需要重点把握以下两大主线. 静态view 即 RDD, transformation a ...

  9. Spark源码学习3

    转自:http://www.cnblogs.com/hseagle/p/3673132.html 一.概要 本篇主要阐述在TaskRunner中执行的task其业务逻辑是如何被调用到的,另外试图讲清楚 ...

随机推荐

  1. ASP.NET MVC学习系列(一)-WebAPI初探

    由于即将要接手的新项目计划用ASP.NET MVC3来开发,所以最近一段时间一直在看相关的书或文章.因为之前在大学里也曾学习过MVC2开发,也做过几个简单的MVC2的小型测试项目,不过在后来工作以后主 ...

  2. linux下安装及配置和启动memcached

    一.下载文件: 下载memcached和libevent,放到/hom/zwl/目录下 # wget http://www.danga.com/memcached/dist/memcached-1.2 ...

  3. 亚马逊EC2 ubuntu下安装mysql远程无法连接问题o

    无法远程的原因有很多,我今天遇到的问题是通过navicat无法远程连接我在EC2上创建的实例. 1.通过命令" netstat -an|grep 3306 "检查一下3306端口对 ...

  4. hibernate的二级缓存

    缓存(Cache): 计算机领域非常通用的概念.它介于应用程序和永久性数据存储源(如硬盘上的文件或者数据库)之间,其作用是降低应用程序直接读写永久性数据存储源的频率,从而提高应用的运行性能.缓存中的数 ...

  5. 安装eclipse插件时出现问题

    有时候我们安装eclipse插件时,会无法找到repository,这个时候去除掉多余的包,可能就行了.以下例子是安装spring插件,如果全选的话无法安装所有的插件,最终会失败 2.这时我们可以去掉 ...

  6. Action<>和Func<> 委托【代理】

    C#中的Action<>和Func<> 其实他们两个都是委托[代理]的简写形式. 一.[action<>]指定那些只有输入参数,没有返回值的委托 Delegate的 ...

  7. checkbox将选中的数据提交到后台

    在项目中有些地方需要批量添加的数据,在这里使用到checkbox比较方便一些. 例如:我需要将多个包添加到同一个地区的 主要的前端代码: 这个是用来放checkbox的. <div id=&qu ...

  8. php注意事项

    1. 不要使用mysql_函数 这一天终于来了,从此你不仅仅"不应该"使用mysql_函数.PHP 7 已经把它们从核心中全部移除了,也就是说你需要迁移到好得多的mysqli_函数 ...

  9. t检验

    例子:以往通过大规模调查已知某地新生儿出生体重为3.30kg.从该地难产儿中随机抽取35名新生儿作为研究样本,平均出生体重为3.42kg,标准差为0.40kg. 问该地难产儿出生体重是否与一般新生儿体 ...

  10. Myeclipse2016 部署webapp 至 tomcat 上出现 “There are no resources that can be added or removed from the server”

    对要部署的项目右键---Properties---Myeclipse---选中Dynamic Web Module 和 Java