spark任务划分源码点击流程

=====================================Stage划分源码
collect算子点进去 点runjob runjob runjob runjob runjob 直到进入DAGScheduler类的734行的runjob方法
DAGScheduler类的742行有一个submitJob(提交job的方法) 点进去 进入到 681行
往下翻 来到714行 有个eventProcessLoop.post() DAGScheduler将任务压到消息队列里面  点进去进入到EventLoop类的102行
往上翻到44行 来到EventLoop类的run方法 (线程启动方法) 里面有个onReceive方法(49行) 点进去
发现是个抽象方法 CTRL+H 查看方法对的实现类 双击DAGSchedulerEventProcessLoop 发现又回到了DAGScheduler 
DAGScheduler的2149行有个onReceive 里面调用了doOnReceive(event) 点进去 来到了DAGScheduler的2158行 看到了一堆模式匹配
点击第一个模式匹配 dagScheduler.handleJobSubmitted() 来到了DAGScheduler的975行的handleJobSubmitted方法
982行看到了var finalStage: ResultStage = null (PPT上的第一个角色出现 )
往下走到986行 看到了finalStage = createResultStage(finalRDD, func, partitions, jobId, callSite) 点进去 [重点方法]
来到了445行的createResultStage 方法  往下走就是454行的 val parents = getOrCreateParentStages(rdd, jobId) 查找上级stage
点进去 来到了446行 看到467行的getShuffleDependencies方法  获取shuffle宽依赖个数 返回parents
然后来到468行的 getOrCreateShuffleMapStage(shuffleDep, firstJobId) 创建对应个数的ShuffleMapStage (PPT上的第二个角色)  
到此说明spark程序的stage确实是根据shuffle个数来划分的...
=====================================Task个数源码==========================================
点击后退按钮  回到DAGScheduler的986行  然后往下翻 来到1033行的finalStage.setActiveJob(job)  stage关联job
再往下来到1038行 submitStage(finalStage) 递归提交stage  点进来 来到1085行的submitStage 方法
1091行 val missing = getMissingParentStages(stage).sortBy(_.id) 获取missingstage 找到stage的起始位置准备开始执行
1095行 submitMissingTasks(stage, jobId.get) 提交task  点进去 来到1109行的submitMissingTasks方法
往下翻 一直翻到 1217行的val tasks: Seq[Task[_]] = try { 
在1219行 看到stage的模式匹配  一个是ShuffleMapStage 一个是ResultStage
以ShuffleMapStage为例 查看task个数怎么生成   点击1222行的partitionsToCompute  
来到1122行 点击 stage.findMissingPartitions()  
来到Stage.scala的118行的抽象方法  def findMissingPartitions(): Seq[Int] 
CTRL+H 查看实现类  分别看到 ResultStage 和 ShuffleMapStage
点进去分别查看 
ResultStage 63行  (0 until job.numPartitions)
ShuffleMapStage 94行 getOrElse(0 until numPartitions)
到此说明Task个数 是由spark的阶段的最后一个rdd的分区数来决定的

 
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值