Spark系列(九)DAGScheduler工作原理
以wordcount为示例进行深入分析
| 1 | |
| 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
| 1 | // 计算每个task对应的partition最佳位置 |
| 2 | // 从stage的最后一个rdd开始查找,看rdd的partition是否有被cache、chencjpoint, |
| 3 | // 如果有那么task的最佳位置就被cache或者checkpoint的partition的位置 |
| 4 | private def getPreferredLocsInternal( |
| 5 | rdd: RDD[_], |
| 6 | partition: Int, |
| 7 | visited: HashSet[(RDD[_],Int)]) |
| 8 | : Seq[TaskLocation] = |
| 9 | { |
| 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工作原理的更多相关文章
- Spark系列(十)TaskSchedule工作原理
工作原理图 源码分析: 1.) 25 launchedTask = true 26 } 27 } catch { 28 ...
- Spark系列(八)Worker工作原理
工作原理图 源代码分析 包名:org.apache.spark.deploy.worker 启动driver入口点:registerWithMaster方法中的case LaunchDriver ...
- line-height系列——定义和工作原理总结
一.line-height的定义和工作原理总结 line-height的属性值: normal 默认 设置合理的行间距. number 设置数字,此数字会与当前的字体尺寸相乘来设置行间距li ...
- MySQL系列(九)--InnoDB索引原理
InnoDB在MySQL5.6版本后作为默认存储引擎,也是我们大部分场景要使用的,而InnoDB索引通过B+树实现,叫做B-tree索引.我们默认创建的 索引就是B-tree索引,所以理解B-tree ...
- 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL
周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...
- 49、Spark Streaming基本工作原理
一.大数据实时计算介绍 1.概述 Spark Streaming,其实就是一种Spark提供的,对于大数据,进行实时计算的一种框架.它的底层,其实,也是基于我们之前讲解的Spark Core的. 基本 ...
- “Ceph浅析”系列之五——Ceph的工作原理及流程
本文将对Ceph的工作原理和若干关键工作流程进行扼要介绍.如前所述,由于Ceph的功能实现本质上依托于RADOS,因而,此处的介绍事实上也是针对RADOS进行.对于上层的部分,特别是RADOS GW和 ...
- JSP JSP工作原理 JSP语法 JSP声明 JSP注释 JSP指令 jsp九大隐式/内置对象
1 什么是JSP 1)为什么说,Servlet是一个动态Web开发技术呢? Servlet是基于服务端的一种动态交互技术, HttpServletRequest表示客户端到服务端的 ...
- 4.Apache Spark的工作原理
Apache Spark的工作原理 1 Why Apache Spark 2 关于Apache Spark 3 如何安装Apache Spark 4 Apache Spark的工作原理 5 spark ...
随机推荐
- java:构造函数
class Dog { Dog(){ } } 构造函数没有返回值定义,构造函数名必须和类名相同,如果类里面没有构造函数,编译器会帮你加一个构造函数. 使用this调用构造函数 class Dog { ...
- 字符编解码的故事–ASCII,ANSI,Unicode,Utf-8区别(转)
很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们认为8个开关状态作为原子单位很好,于是他们把这称为”字节”. 再后来,他们又做了一些可以处理这些字节的 ...
- python mysql 简单总结(MySQLdb模块 需另外下载)
python 通过DB-API规范了它所支持的不同的数据库,使得不同的数据库可以使用统一的接口来访问和操作. 满足DB-API规范的的模块必须提供以下属性: 属性名 描述 apilevel DB-AP ...
- 87. Scramble String
题目: Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty subs ...
- DNS子域委派配置案例[转载]
最近在研究linux dns 在51上面看见这篇文章,感觉讲的很透彻,随转载,方便以后自己查阅 原文地址:http://www.51osos.com/a/Linux_CentOS_RedHat/Lin ...
- C# 计时器的三种使用方法
在.net中有三种计时器,一是System.Windows.Forms命名空间下的Timer控件,它直接继承自Componet;二是System.Timers命名空间下的Timer类. Timer控件 ...
- HDU 4483 Lattice triangle(欧拉函数)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4483 题意:给出一个(n+1)*(n+1)的格子.在这个格子中存在多少个三角形? 思路:反着想,所有情 ...
- Python之格式化输出讲解
1.格式化输出整数python print也支持参数格式化,与C言的printf似, strHello = "the length of (%s) is %d" %(Hello W ...
- MyBatis学习总结(5)——实现关联表查询
一对一关联 提出需求 根据班级id查询班级信息(带老师的信息) 创建表和数据 创建一张教师表和班级表,假设一个老师负责教一个班,那么老师和班级之间的关系就是一对一的关系. create table t ...
- hdu 4941 Magical Forest ( 双重map )
题目链接 题意: 有一个n*m的田地,里边有k棵树,每棵树的位置为(xi,yi),含有能量值ci.之后又q个询问,分三种; 1)1 a b,将a行和b行交换 2)2 a b,将a列和b列交换 3)3 ...