《深入理解Spark-核心思想与源码分析》(五)第五章任务提交与执行
即欲捭之贵周,即欲阖之贵密。周密之贵,微而与道相随。---《鬼谷子》
解释:译文:如果要分析问题,关键在于周详,如果要综合归纳问题,关键在于严密。周详严密的关键在于精深而与道相随。
解词:捭阖(bǎihé):开合。意为运用某些计策和手段,使双方联合或分化。含此义的成语有“纵横捭阖”。
解析:《鬼谷子》是一部充满着谋略和智慧的名著。“即欲捭之贵周,即欲阖之贵密”十分鲜明地体现了此书的特点。文中首先提出了“捭”和“阖”,这是两种不同的克敌制胜的计策。然后,再提出运用这两种计策必须具有的智慧,即“捭”要贵于周详,“阖”要贵于严密。在此基础上,又进一步指出,“周密之贵”在于“微而与道相随”。“微”意在“周密”之上,再进一步精深严密。最后提高到“道”上,则是理性的升华。
读此名句,在于有助于谋略的深化和智慧的提升。
5.1任务概述
1.完成RDD的转换及DAG的构建
2.完成finalStage的创建与Stage的划分,做好Stage与Task的准备工作后,最后提交Stage与Task。
3.使用集群管理器分配资源与任务调度,,对于失败的有重试和容错机制。
4.执行任务
5.2 广播Hadoop的配置信息
SparkContext的BroadCast方法用于广播Hadoop的配置信息。
def broadcast[T: ClassTag](value: T): Broadcast[T] = {
assertNotStopped()
require(!classOf[RDD[_]].isAssignableFrom(classTag[T].runtimeClass),
"Can not directly broadcast RDDs; instead, call collect() and broadcast the result.")
val bc = env.broadcastManager.newBroadcast[T](value, isLocal)
val callSite = getCallSite
logInfo("Created broadcast " + bc.id + " from " + callSite.shortForm)
cleaner.foreach(_.registerBroadcastForCleanup(bc))
bc
}
上面的代码通过使用BroadcastManager发送广播,广播结束将广播对象注册到ContextCleaner中,以便清理。
代码中BroadcastManager的newBroadcast方法实际上代理了broadcastFactory的newBroadcast。
5.3 RDD转换及DAG构建
为什么需要RDD?
下面从四个方面解释:
1.数据模型方面
RDD是一个容错的、并行的数据结构,可以控制将数据存储到磁盘或者内存,能够获取数据的分区。
2.依赖划分原则
依赖主要分为宽依赖和窄依赖,窄依赖划分为用一个Stage,管道方式迭代执行。
宽依赖的上游RDD不止一个,往往需要跨节传输数据。
3.数据处理效率
4.容错处理
RDD实现分析
5.4 任务提交
任务提交准备
1.经过5.3节对RDD的层层转换以及DAG的构建。
接下来调用RDD的collect方法转成Seq,封装为Seq为ArrayList
RDD的collect方法调用SparkContext的runJob
SparkContext的runJob重新调用runJob,点击runJob进入源代码
接着调用重载的runJob,最终调用的runJob方法又一次调用clean方法防止闭包的反序列化错误,然后运行dagScheduler的runJob
1.提交Job
submitJob方法将一个Job提交到Job scheduler,处理过程:
1)、调用RDD的paritition函数来获取当前Job的最大分区数,即为maxPartitions。根据maxPartitions,确认我们没有一个不存在的partition上运行的任务
2)、生成当前Job的JobId
3)、创建JobWaiter
4)、向eventProcessActor发送JobSubmitted
5)、返回JobWaiter
2.处理Job提交
DAGSchedulerEventProcessActor收到JobSubmit事件,会调用dagScheduler的handleJobSubmitted方法。
5.4.2 finalStage的创建与Stage的划分
在Spark中,一个Job可能被划分为一个或者多个Stage,各个之间存在依赖关系,其中最下游的Stage也被成为最终的Stage,用于处理Job最后阶段的工作
1.newStage的实现分析
handleJobSubmitted方法使用newStage方法创建finalStage
2.获取父Stage列表
Spark的Job会被划分到一到多个Stage,这些Stage的划分是从finalStage开始,从后往前边划分边创建的。getParentStages方法用于获取或者创建给定的RDD的所有父Stage
这些Stage将被分配给jobId对应的job
3.获取map任务对应Stage
getShuffleMapStage方法用于创建或者获取Stage并注册到shuffleToMapStage
5.4.3 创建Job
5.4.4 提交Stage
5.4.5 提交Task
5.5 执行任务
5.5.1 状态更新
调用execBackend的statusUpdate方法更新任务状态。
5.5.2 任务还原
所谓任务还原就是将Driver提交的Task在Executor上通过反序列化、更新依赖达到Task的还原效果的过程。
5.5.3任务运行
TaskRunner最终调用Task的run方法运行任务。
5.6 任务执行后续处理
5.6.1 计量统计与执行结果序列化
5.6.2 内存回收
TaskRunner的run方法最后还会在finally中做一些清理工作。
5.6.3 执行结果处理
5.7 小结
首先从Spark为什么设计RDD入手,依次讲解RDD的实现分析、Stage的划分、提交Stage、任务执行、执行结果处理等内容。
在资源分配中涉及的本地化实现,本章做了较为详细的分析,Spark通过一种阶梯式的本地化策略,
在有效利用资源、节省网络I/O的同时提高系统执行的效率。
容错方面,Spark通过DAG构成的有向无环图可以在某些任务执行失败的情况下,通过重新提交任务达到容错,而那些执行成功的任务由于结果已经存在缓存中,所以不需要重复计算。
《深入理解Spark-核心思想与源码分析》(五)第五章任务提交与执行的更多相关文章
- 《深入理解Spark:核心思想与源码分析》——SparkContext的初始化(叔篇)——TaskScheduler的启动
<深入理解Spark:核心思想与源码分析>一书前言的内容请看链接<深入理解SPARK:核心思想与源码分析>一书正式出版上市 <深入理解Spark:核心思想与源码分析> ...
- 《深入理解Spark:核心思想与源码分析》(前言及第1章)
自己牺牲了7个月的周末和下班空闲时间,通过研究Spark源码和原理,总结整理的<深入理解Spark:核心思想与源码分析>一书现在已经正式出版上市,目前亚马逊.京东.当当.天猫等网站均有销售 ...
- 《深入理解Spark:核心思想与源码分析》(第2章)
<深入理解Spark:核心思想与源码分析>一书前言的内容请看链接<深入理解SPARK:核心思想与源码分析>一书正式出版上市 <深入理解Spark:核心思想与源码分析> ...
- 《深入理解Spark:核心思想与源码分析》一书正式出版上市
自己牺牲了7个月的周末和下班空闲时间,通过研究Spark源码和原理,总结整理的<深入理解Spark:核心思想与源码分析>一书现在已经正式出版上市,目前亚马逊.京东.当当.天猫等网站均有销售 ...
- 《深入理解Spark:核心思想与源码分析》正式出版上市
自己牺牲了7个月的周末和下班空闲时间,通过研究Spark源码和原理,总结整理的<深入理解Spark:核心思想与源码分析>一书现在已经正式出版上市,目前亚马逊.京东.当当.天猫等网站均有销售 ...
- 《深入理解Spark-核心思想与源码分析》(一)总体规划和第一章环境准备
<深入理解Spark 核心思想与源码分析> 耿嘉安著 本书共计486页,计划每天读书20页,计划25天完成. 2018-12-20 1-20页 凡事豫则立,不豫则废:言前定,则不跲:事 ...
- Vue系列---理解Vue.nextTick使用及源码分析(五)
_ 阅读目录 一. 什么是Vue.nextTick()? 二. Vue.nextTick()方法的应用场景有哪些? 2.1 更改数据后,进行节点DOM操作. 2.2 在created生命周期中进行DO ...
- spark的存储系统--BlockManager源码分析
spark的存储系统--BlockManager源码分析 根据之前的一系列分析,我们对spark作业从创建到调度分发,到执行,最后结果回传driver的过程有了一个大概的了解.但是在分析源码的过程中也 ...
- Android源码分析(十五)----GPS冷启动实现原理分析
一:原理分析 主要sendExtraCommand方法中传递两个参数, 根据如下源码可以知道第一个参数传递delete_aiding_data,第二个参数传递null即可. @Override pub ...
随机推荐
- Test plan
Options for Test Strategy: 1. Regular test: all the planned test cases will be executed 2. Extented ...
- 33、求按从小到大的顺序的第N个丑数
一.题目 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 二.解法 ...
- Java八种基本类型
boolean 二进制位: true ,false byte 二进制位:8 -128 - 127 -2的7次方到2的7次方-1 char 二进制位:16 0 - 65535 short 二 ...
- 用VIM查看编辑二进制文件
用VIM查看编辑二进制文件 vim可以很方便地编辑二进制文件,个人认为它比emacs的二进制编辑方式更好用.vim中二进制文件的编辑是先通过外部程序xxd来把文件dump成其二进制的文本形式,然后就可 ...
- centos7安装ssh服务
1.查看是否安装了相关软件: rpm -qa|grep -E "openssh" 显示结果含有以下三个软件,则表示已经安装,否则需要安装缺失的软件 openssh-ldap-6.6 ...
- YAML中使用Jinja模板以{{ foo }}开头需要整行加双引号
YAML陷阱 YAML语法要求如果值以{{ foo }}开头的话我们需要将整行用双引号包起来.这是为了确认你不是想声明一个YAML字典.该知识点在 YAML 语法 页面有所讲述. 这样是不行的: - ...
- 构建最基础的Spring项目及所需要的jar包
1.Spring 框架由6个模块组成 上图是spring4的结构图,不同版本结构略有差异,但模块都是相同的. 2.Core Container 核心容器 容器是Spring的核心部分,Core Con ...
- python的scrapy框架
scrapy是python中数据抓取的框架.简单的逻辑如下所示 scrapy的结构如图所示,包括scrapy engine.scheduler.downloader.spider.item pipel ...
- 1、量化投资—为什么选择Python?
Python在量化领域的现状 就跟Java在web领域无可撼动的地位一样,Python也已经在金融量化投资领域占据了重要位置,从各个业务链条都能找到相应的框架实现. 在量化投资(证券和比特币)开源项目 ...
- php强制输出到浏览器下载
$file_name="test.mp3"; $mp3_url = "";header( "Pragma: public" );header ...