以wordcount为示例进行深入分析

33  ) {
46        logInfo("Submitting " + tasks.size + " missing tasks from " + stage + " (" + stage.rdd + ")")
47        stage.pendingTasks ++= tasks
48        logDebug("New pending tasks: " + stage.pendingTasks)
49        // 对stage的task创建TaskSet对象,调用TaskScheduler的submitTasks()方法提交TaskSet
50        taskScheduler.submitTasks(
51          new TaskSet(tasks.toArray, stage.id, stage.newAttemptId(), stage.jobId, properties))
52        stage.latestInfo.submissionTime = Some(clock.getTimeMillis())
53      }
54      
55      ...................... 
56    }

 

getPreferredLocsInternal

功能:

计算每个task对应的partition最佳位置,从stage的最后一个rdd开始查找,看rdd的partition是否有被cache、chencjpoint,如果有那么task的最佳位置就被cache或者checkpoint的partition的位置

调用过程:

submitMissingTasks->getPreferredLocs->getPreferredLocsInternal

// 计算每个task对应的partition最佳位置
  // 从stage的最后一个rdd开始查找,看rdd的partition是否有被cache、chencjpoint,
  // 如果有那么task的最佳位置就被cache或者checkpoint的partition的位置
  private def getPreferredLocsInternal(
      rdd: RDD[_],
      partition: Int,
      visited: HashSet[(RDD[_],Int)])
    : Seq[TaskLocation] =
  {
10      // If the partition has already been visited, no need to re-visit.
11      // This avoids exponential path exploration.  SPARK-695
12      if (!visited.add((rdd,partition))) {
13        // Nil has already been returned for previously visited partitions.
14        return Nil
15      }
16      // If the partition is cached, return the cache locations
17      // 寻找rdd是否被缓存
18      val cached = getCacheLocs(rdd)(partition)
19      if (!cached.isEmpty) {
20        return cached
21      }
22      // If the RDD has some placement preferences (as is the case for input RDDs), get those
23      // 寻找当前RDD是否被cachepoint
24      val rddPrefs = rdd.preferredLocations(rdd.partitions(partition)).toList
25      if (!rddPrefs.isEmpty) {
26        return rddPrefs.map(TaskLocation(_))
27      }
28      // If the RDD has narrow dependencies, pick the first partition of the first narrow dep
29      // that has any placement preferences. Ideally we would choose based on transfer sizes,
30      // but this will do for now.
31      // 递归调用自己寻找rdd的父rdd,检查对应的partition是否被缓存或者checkpoint
32      rdd.dependencies.foreach {
33        case n: NarrowDependency[_] =>
34          for (inPart <- n.getParents(partition)) {
35            val locs = getPreferredLocsInternal(n.rdd, inPart, visited)
36            if (locs != Nil) {
37              return locs
38            }
39          }
40        case _ =>
41      }
42      // 如果stage从最后一个rdd到最开始的rdd,partiton都没有被缓存或者cachepoint,
43      // 那么task的最佳位置(preferredLocs)为Nil
44      Nil
45    }

Spark系列(九)DAGScheduler工作原理的更多相关文章

  1. Spark系列(十)TaskSchedule工作原理

    工作原理图 源码分析: 1.) 25              launchedTask = true 26            } 27          } catch { 28         ...

  2. Spark系列(八)Worker工作原理

    工作原理图   源代码分析 包名:org.apache.spark.deploy.worker 启动driver入口点:registerWithMaster方法中的case LaunchDriver ...

  3. line-height系列——定义和工作原理总结

    一.line-height的定义和工作原理总结 line-height的属性值: normal    默认  设置合理的行间距. number  设置数字,此数字会与当前的字体尺寸相乘来设置行间距li ...

  4. MySQL系列(九)--InnoDB索引原理

    InnoDB在MySQL5.6版本后作为默认存储引擎,也是我们大部分场景要使用的,而InnoDB索引通过B+树实现,叫做B-tree索引.我们默认创建的 索引就是B-tree索引,所以理解B-tree ...

  5. 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL

    周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...

  6. 49、Spark Streaming基本工作原理

    一.大数据实时计算介绍 1.概述 Spark Streaming,其实就是一种Spark提供的,对于大数据,进行实时计算的一种框架.它的底层,其实,也是基于我们之前讲解的Spark Core的. 基本 ...

  7. “Ceph浅析”系列之五——Ceph的工作原理及流程

    本文将对Ceph的工作原理和若干关键工作流程进行扼要介绍.如前所述,由于Ceph的功能实现本质上依托于RADOS,因而,此处的介绍事实上也是针对RADOS进行.对于上层的部分,特别是RADOS GW和 ...

  8. JSP JSP工作原理 JSP语法 JSP声明 JSP注释 JSP指令 jsp九大隐式/内置对象

    1 什么是JSP   1)为什么说,Servlet是一个动态Web开发技术呢?     Servlet是基于服务端的一种动态交互技术,     HttpServletRequest表示客户端到服务端的 ...

  9. 4.Apache Spark的工作原理

    Apache Spark的工作原理 1 Why Apache Spark 2 关于Apache Spark 3 如何安装Apache Spark 4 Apache Spark的工作原理 5 spark ...

随机推荐

  1. Photoshop:笔刷制作和安装

    笔刷制作 1.新建一个文档,大小为要制作的笔刷大小,把画笔图像放里面 2.选择:菜单->编辑->定义画笔预设,这时在画笔面板中会出现刚定义的画笔 3.存储画笔,可以把当前的笔刷保存为一个. ...

  2. 不用Invoke就等用 Control.CheckForIllegalCrossThreadCalls = false;

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  3. android从应用到驱动之—camera(1)---程序调用流程

    一.开篇 写博客还得写开篇介绍,可惜,这个不是我所擅长的.就按我自己的想法写吧. 话说camera模块,从上层到底层一共包含着这么几个部分: 1.apk------java语言 2.camera的ja ...

  4. Android自动化测试之Monkeyrunner从零开始(三)

    转自http://www.51testing.com/html/81/22381-854342.html 时光过得太快了,一晃离上一篇monkeyrunner系列的博客已经一年多了.这一年多时间经历了 ...

  5. LA 4636 (贪心) Cubist Artwok

    题意: 一个由若干小正方体组成的图形,给出它的正视图和侧视图,求满足条件的最少小正方体的个数. 分析: 虽说是一道简单的贪心,可一直没有太好的思路. 又一次可耻地看了别人的题解. http://blo ...

  6. POJ 2752 (KMP 所有可能长度的前缀后缀) Seek the Name, Seek the Fame

    题意: 求一个字符串的相同前缀后缀的所有可能的长度,这里该字符串其本身也算自己的前缀和后缀. 分析: 我们知道next数组的性质是,该字符之前的字符串的最大相同前缀后缀. 既然知道了最大的,即next ...

  7. android webview js alert对话框 不能弹出 解决办法

    在配置了webview的 setting属性后,以前设置的都是可以直接弹出来的,今天写一个小demo时候莫名其妙的发现alert怎么也出来,即使设置了这么多也不行: webSettings.setJa ...

  8. android错误 Android NAND: nand_dev_load_disk_state,

    Android NAND: nand_dev_load_disk_state, 总是提示上面这个错误,我以为是内存分配不足呢,但是内存足够用也不行,后来在国外的网站上看到这个问题的解答,说是把用到的A ...

  9. 转载RabbitMQ入门(1)--介绍

    目录[-] "Hello World" (使用java客户端) 发送 接收 把所有放在一起 前面声明本文都是RabbitMQ的官方指南翻译过来的,由于本人水平有限难免有翻译不当的地 ...

  10. Struts2中通配符

    1.Struts2中通配符可通过请求的url路径来确定包.类.方法.返回值名. 如 <action name="*_*_*_*" class="cn.javass. ...