spark任务运行流程及内部任务的调度机制

25 篇文章 1 订阅
订阅专栏
13 篇文章 0 订阅
订阅专栏

原文链接:https://juejin.im/post/5e7485e76fb9a07caf447f12

本文将针对spark中的Driver和Executor讲起,简述了spark的运行流程,部署模式以及内部任务调度机制,希望针对spark任务执行过程进行尽可能好理解的解析

1.两个重要的主角

​ 在spark中,有两个重要的主角是绕不开的,driver和executor,他们的结构呈一主多从模式,driver就是那个单身狗,控制欲很强,权利也很大,每天独自一人没别的事,就想法设法的指挥着手下一堆executor到处干活。他们分工明确,组织结构简单,共同支撑起了spark强大的计算引擎。

Driver

​ Spark 驱动器节点,用于执行 Spark 任务中的 main 方法,负责实际代码的执行工作。Driver 在 Spark 作业执行时主要负责:

  1. 将代码逻辑转化为任务;

  2. 在 Executor 之间调度任务(job);

  3. 跟踪 Executor 的执行情况(task)。

Executor

​ Spark 执行器节点,负责在 Spark 作业中运行具体任务,任务之间相互独立。Spark 应用启动时,Executor 节点被同时启动,并且始终伴随着整个 Spark 应用的生命周期而存在。如果有 Executor 点发生了故障或崩溃,Spark 应用也可以继续执行,会将出错节点上的任务调度到其他 Executor 节点上继续运行。Executor 有两个核心功能:

  1. 负责运行组成 Spark 应用的任务,并将结果返回给驱动器进程;

  2. 通过自身的块管理器(Block Manager)为用户程序中要求缓存的 RDD提供内存式存储。RDD 是直接缓存在 Executor 进程内的,因此任务可以在运行时充分利用缓存数据加速运算。

Spark 运行流程

 

 

 

​ 不论spark以何种方式部署,在任务提交后,都先启动Driver,然后Driver向集群管理器注册应用程序,之后集群管理器根据此任务的配置文件分配Executor并启动,然后Driver等待资源满足,执行 main 函数,Spark的查询为懒执行,当执行到 action 算子时才开始真正执行,开始反向推算,根据宽依赖进行 stage 的划分,随后每一个 stage 对应一个 taskset,一个taskset 中有多个 task,task 会被分发到指定的 Executor 去执行,在任务执行的过程中,Executor 也会不断与 Driver 进行通信,报告任务运行情况。

2.spark的部署模式

2.1 spark部署类型

Spark共支持3种集群管理器,Standalone,Mesos和Yarn

  • Standalone:

独立模式,Spark 原生的最简单的一个集群管理器。 它可以运行在各种操作系统上,自带完整的服务,无需依赖任何其他资源管理系统,使用 Standalone 可以很方便地搭建一个集群。

  • Apache Mesos

    Mesos也是一个强大的分布式资源管理框架,是以与Linux内核同样的原则而创建的,允许多种不同的框架部署在其上

  • Hadoop Yarn

    Hadoop生态下的统一资源管理机制,在上面可以运行多套计算框架,如mapreduce、spark 等,根据 driver 在集群中的位置不同,部署模式可以分为 yarn-client 和 yarn-cluster。

    Spark 的运行模式取决于传递给 SparkContext 的 MASTER 环境变量的值,spark在yarn上部署:

    1. yarn-client:Driver在本地,Executor在Yarn集群,配置:--deploy-mode client
    2. yarn-cluster:Driver和Executor都在Yarn集群,配置:--deploy-mode cluster

2.2 Yarn模式下的运行机制

当前流行的工作模式均是将spark提交到Yarn上,所以这里我们针对spark on Yarn做一下详细了解。

  • yarn-client 模式

​ 在YARNClient模式下,Driver在任务提交的本地机器上运行,Driver会向ResourceManager申请启动ApplicationMaster,随后ResourceManager分配container,在合适的NodeManager上启动ApplicationMaster,此时的ApplicationMaster的功能相当于一个ExecutorLaucher,只负责向ResourceManager申请Executor内存。   ResourceManager接到ApplicationMaster的资源申请后会分配container,然后 ApplicationMaster在资源分配指定的NodeManager上启动Executor进程,Executor进程启动后会向Driver反向注册。另外一条线,Driver自身资源满足的情况下,Driver开始执行main函数,之后执行Action算子时,触发一个job,并根据宽依赖开始划分stage,每个stage生成对应的taskSet,Executor注册完成后,Driver将task分发到各个Executor上执行。

 

 

 

  • yarn-cluster

​ 在 YARN Cluster 模式下,任务提交后会和 ResourceManager 通讯申请启动ApplicationMaster,随后 ResourceManager 分配 container,在合适的 NodeManager上启动 ApplicationMaster,此时的ApplicationMaster 就是 Driver。

​ Driver 启动后向 ResourceManager 申请 Executor 内存,ResourceManager会分配container,然后在合适的 NodeManager 上启动 Executor 进程,Executor 进程启动后会向 Driver 反向注册。另外一条线,Driver自身资源满足的情况下,开始执行main函数,之后执行Action算子时,触发一个job,并根据宽依赖开始划分stage,每个stage生成对应的taskSet,Executor注册完成后,Driver将task分发到各个Executor上执行。

 

 

 

3.Spark 任务调度

​ Driver会根据用户程序准备任务,并向Executor分发任务,在这儿有几个Spark的概念需要先介绍一下:

  • Job:以Action算子为界,遇到一个Action方法就触发一个Job

  • Stage:Job的子集,一个job至少有一个stage,以shuffle(即RDD宽依赖)为界,一个shuffle划分一个stage

  • Task: Stage 的子集,以并行度(分区数)来衡量,分区数是多少,则有多少

    个 task。

spark在具体任务的调度中,总的分两路进行:Stage级别调度和Task级别调度。Spark RDD通过转换(Transactions)算子,形成了血缘关系图DAG,最后通过行动(Action)算子,触发Job并调度执行。

DAGScheduler负责Stage级的调度,主要是将DAG切分成若干Stages,并将每个Stage打包成TaskSet交给TaskScheduler调度。

TaskScheduler负责Task级的调度,将DAGScheduler给过来的TaskSet按照指定的调度策略分发到Executor上执行

3.1 Spark Stage级调度

​ Spark的任务调度是从DAG切割开始,主要是由DAGScheduler来完成。当遇到一个Action操作后就会触发一个Job的计算,并交给DAGScheduler来处理。

DAGScheduler主要做两个部分的事情:

  1. 切分stage

​ DAGScheduler会根据RDD的血缘关系构成的DAG进行切分,将一个Job划分为若干Stages,具体划分策略是:从后往前,由最终的RDD不断通过依赖回溯判断父依赖是否是宽依赖,遇到一个shuffle就划分一个Stage。无shuffle的称为窄依赖,窄依赖之间的RDD被划分到同一个Stage中。划分的Stages分两类,一类叫做ResultStage,为DAG最下游的Stage,由Action方法决定,另一类叫做ShuffleMapStage,为下游Stage准备数据。

​ stage任务调度本身是一个反向的深度遍历算法,以下图wordcount为例。此处只有saveAsTextFile为行动算子,该 Job 由 RDD-3 和 saveAsTextFile方法组成,根据依赖关系回溯,知道回溯至没有依赖的RDD-0。回溯过程中,RDD-2和RDD-3存在reduceByKey的shuffle,会划分stage,由于RDD-3在最后一个stage,即划为ResultStage,RDD-2,RDD-1,RDD-0,这些依赖之间的转换算子flatMap,map没有shuffle,因为他们之间是窄依赖,划分为ShuffleMapStage。

 

 

 

  1. 打包Taskset提交Stage

​ 一个Stage如果没有父Stage,那么从该Stage开始提交,父Stage执行完毕才能提交子Stage。Stage提交时会将Task信息(分区信息以及方法等)序列化并被打包成TaskSet交给TaskScheduler,一个Partition对应一个Task,另一方面TaskScheduler会监控Stage的运行状态,只有Executor丢失或者Task由于Fetch失败才需要重新提交失败的Stage以调度运行失败的任务,其他类型的Task失败会在TaskScheduler的调度过程中重试。

3.2 Spark Task 级调度

​ SparkTask的调度是由TaskScheduler来完成,TaskScheduler将接收的TaskSet封装为TaskSetManager加入到调度队列中。同一时间可能存在多个TaskSetManager,一个TaskSetManager对应一个TaskSet,而一个TaskSet含有n多个task信息,这些task都是同一个stage的。

​ TaskScheduler初始化后会启动SchedulerBackend,它负责跟外界打交道,接收Executor的注册信息,并维护Executor的状态,SchedulerBackend会监控到有资源后,会询问TaskScheduler有没有任务要运行,TaskScheduler会从调度队列中按照指定的调度策略选择TaskSetManager去调度运行。

​ TaskSetManager按照一定的调度规则一个个取出task给TaskScheduler,TaskScheduler再交给SchedulerBackend去发到Executor上执行。

​ Task被提交到Executor启动执行后,Executor会将执行状态上报给SchedulerBackend,SchedulerBackend则告诉TaskScheduler,TaskScheduler找到该Task对应的TaskSetManager,并通知到该TaskSetManager,这样TaskSetManager就知道Task的运行状态

3.3 失败重试和白名单

​ 对于运行失败的Task,TaskSetManager会记录它失败的次数,如果失败次数还没有超过最大重试次数,那么就把它放回待调度的Task池子中等待重新执行,当重试次数过允许的最大次数,整个Application失败。在记录Task失败次数过程中,TaskSetManager还会记录它上一次失败所在的ExecutorId和Host,这样下次再调度这个Task时,会使用黑名单机制,避免它被调度到上一次失败的节点上,起到一定的容错作用。


作者:南山饱虎
链接:https://juejin.im/post/5e7485e76fb9a07caf447f12
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

spark性能优化点(超详解!!!珍藏版!!!)
weixin_43614188的博客
02-21 806
spark性能优化点 分配更多的资源 1.1 分配哪些资源 1.2 在哪里可以设置这些资源 1.3 参数调节到多大,算是最大 分配更多的资源: 它是性能优化调优的王道,就是增加和分配更多的资源,这对于性能和速度上的提升是显而易见的, 基本上,在一定范围之内,增加资源与性能的提升,是成正比的;写完了一个复杂的spark作业之后,进行性能调 优的时候,首先第一步,就是要来调节最优的资源配置;在这个基...
Spark精讲】Spark任务运行流程
话数Science
12-12 2559
Spark精讲,Spark任务运行流程Spark任务执行流程,client模式,cluster模式,yarn-client模式,yarn-cluster模式,master参数
Spark shuffle(ExchangeExec)过多导致任务运行过慢甚至超时
monkeyboy_tech的博客
03-15 2378
背景以及现象 本文基于 spark 3.1.2 设置spark.driver.memory=2g 在调试spark sql任务的时候,发现有任务产生了200多个exchange,而且任务长期运行不出来。 分析 运行对应的sql(多个连续的join操作,且join的key都不一样),得到如下的物理计划(我们只截取了一部分): 和之前的文章spark task过多导致任务运行过慢甚至超时 做法一样(对应的内存都是调优完后的镜像信息),三部曲如下: 用jstat -gcutil查看一下对应的gc情况,如下:
Spark性能调优
岁月的拾荒者
09-28 778
1、常规性能调优 1.1、常规性能调优方案一:最优资源配置 Spark 性能调优的第一步,就是为任务分配更多的资源,在一定范围内,增加资源的分配与性能的提升是成正比的,实现了最优的资源配置后,在此基础上再考虑进行后面论述的性能调优策略。 可以进行分配的资源如下表所示: 名称 说明 --driver-memory 配置driver内存(影响不大) --executor-memor...
Spark大数据分析与实战课后答案
热门推荐
BIPT919的博客
06-09 2万+
Spark大数据分析实战课后答案
Spark内核篇03】Spark任务调度机制1
08-04
(3)Task是Stage的子集,以并行度(分区数)来衡量,分区数是多少,则有多少个task (2)SparkContext将Job交给DAGScheduler
spark任务执行深入浅出
12-30
spark刨析
big-whale:Spark、Flink等离线任务调度以及实时任务的监控
05-13
巨鲸任务调度平台为美柚大数据研发的分布式计算任务调度系统,提供Spark、Flink等批处理任务的DAG调度和流处理任务运行管理和状态监控,并具有Yarn应用管理、重复应用检测、大内存应用检测等功能。 服务基于Spring...
dolphinScheduler海豚调度器动态传递任务执行参数
最新发布
02-23
dolphinScheduler海豚调度器通过设定参数值动态传参,让整个任务流都可以接收到任务参数,方便大批量补采数据任务时无需手动修改每个任务节点的任务执行参数,只需要在入口处对该参数进行修改,然后运行即可。...
Big Whale任务调度系统-其他
06-12
巨鲸任务调度平台为美柚大数据研发的分布式计算任务调度系统,提供Spark、Flink等批处理任务的DAG执行调度和流处理任务的状态监测调度,并具有重复应用检测、大内存应用检测等功能。 服务基于Spring Boot 2.0开发,...
Spark之一:Spark任务运行的基本流程
qq_27241383的博客
10-16 503
Spark任务运行的基本流程 客户端spark-submit指定任务提交给Master,Driver就会向Master注册Application(附带相关需要的资源)客户端提交任务spark-submit --master spark://主机名:7077 --class xxxx.WC xx.jar input output (没有指定资源使用的是默认资源[core.memory]);spa...
Spark调度流程任务调度+资源调度
背着梦的幸存者
11-11 5820
文章目录绪论1、伪代码2、小知识点普及3、图解4、流程介绍 绪论   阅读前请参考《Spark任务调度》和《Spark的资源调度》,以便您更好的理解本文内容。 1、伪代码   下面这段伪代码就是用Scala语言写的一个小的Spark应用程序。如对代码有疑惑请查阅《Scala快速学习》 main(){ //声明配置对象 val conf = new SparkConf() //设置这个App...
Spark任务调度流程
wangleigiser的博客
05-10 348
想要更全面了解Spark内核和应用实战,可以购买我的新书
Spark任务运行过程解析
qichangjian的博客
02-28 367
spark-submit->SparkSubmit->main->submit->doRunMain->RunMain->通过反射,创建我们编写的主类的实例对象,调用main方法->开始执行我们的代码->初始化sparkContext对象->创建初始rdd->出发action算子->提交job->worker执行任务->...
Spark任务任务执行流程
qq_41316200的博客
02-28 2758
(1)将我们编写的程序打成jar包 (2)调用spark-submit脚本提交任务到机场上运行 (3)运行sparkSubmit的main方法,在这个方法中通过反射的方式创建我们编写的主类的实例对象,然后调用main方法,开始执行我们的代码(注意,我们的spark中的driver就运行sparkSubmit进程中)。 (4)当代码运行到创建SparkContext对象时,那就开始初始化SparkContext对象了 (5)在初始化SparkContext对象的时候,会创建两个特别重要的对象,分别是
Spark Core】【RDD】【06】 依赖关系
weixin_43589563的博客
10-10 289
1.RDD 血缘关系 依赖关系:两个相邻RDD之间的关系 血缘关系:多个连续的RDD的依赖关系 2.RDD血缘关系的演示 下图演示了RDD的血缘关系: RDD是不会保存数据的,但是每个RDD会保存自己的血缘关系; 血缘关系的意义:因为RDD不保存数据,一旦计算失败了,不能从上一个RDD重新计算,必须重头计算,那么RDD必须要知道数据源在哪里,血缘关系就用于追溯数据源,提高了容错性 血缘关系演示 package SparkCore._04_血缘关系 import org.apache.spark.r
Spark任务调度
张包峰的博客
12-11 1万+
本文尝试从源码层面梳理Spark任务调度与资源分配上的做法。
Spark----Spark 任务执行流程分析
XiaodunLP的博客
02-15 694
Spark 任务执行流程分析  Spark 任务任务执行流程文字详细描述 (1)、将我们编写的程序打成 jar 包    (2)、调用 spark-submit 脚本提交任务到集群上运行    (3)、运行 sparkSubmit 的 main 方法,在这个方法中通过反射的方式创建我们编写的主类的 实例对象,然后调用 main 方法,开始执行我们的代码(注意,我们的 spark 程序中的...
Spark内核之Task调度规则
weixin_43497444的博客
04-11 535
FIFO调度器 源码: private[spark] class FIFOSchedulingAlgorithm extends SchedulingAlgorithm { override def comparator(s1: Schedulable, s2: Schedulable): Boolean = { val priority1 = s1.priority val ...
Spark任务调度和资源调度流程
07-27
Spark任务调度和资源调度流程可以分为以下几个步骤: 1. 任务提交:用户通过Spark应用程序将任务提交给Spark集群的主节点。 2. 任务划分:主节点将接收到的任务进行划分,将大型任务划分为更小的任务单元,称为...

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • LINUX下多路径(multi-path)介绍及使用 【转载】 33345
  • SecureCRT的常用设置【必备】 24675
  • /etc/pam.d/login Linux-PAM认证方式【转】 20073
  • 最详细的AWR解析报告 16772
  • linux下cpio.gz文件的解压方法 13338

分类专栏

  • hive 34篇
  • Java 6篇
  • spark 13篇
  • 大数据架构 2篇
  • LeetCode 1篇
  • Docker 1篇
  • hbase
  • kafka
  • Hadoop系列 25篇
  • 数据仓库 21篇
  • Oracle 系列 123篇
  • Python系列 4篇
  • others 12篇
  • OGG 1篇
  • Shell
  • MYSQL 2篇
  • Linux系列 22篇
  • Oracle PLSQL 1篇
  • Scala 1篇

最新评论

  • Hive优化-大表join大表优化

    weixin_39630865: 方案四有点问题啊?拆分过后的无数据倾斜的key那部分,你去join了,A表的倾斜数据还是有很多啊,只是join不上了罢了,有点类似那个大量特殊值null,这个时候要不然把A表的大卖家去掉,要不就是得把它随机分散,不知道我理解的对不对表情包

  • Hive之配置使用snappy压缩

    我能成为大神吗: Snappy 不支撑分割

  • Hive优化-大表join大表优化

    wennwennn: 但是没性能展示

  • SQL 先进先出的库龄计算

    lywPython: where date_id <= '20200719' 这个过滤条件是什么意思

  • 数据仓库 Inmon与Kimball数仓理论对比

    Members only: 豁然开朗了,多谢

最新文章

  • hive解析json数组 array json
  • Hive优化-大表join大表优化
  • 【hive】cube和rollup/grouping sets函数
2020年65篇
2019年30篇
2018年3篇
2015年27篇
2014年106篇
2013年17篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

聚圣源女孩子五行缺木起名起个带财的起名魔兽争霸改键器东游记主题曲起名免费取名测分数店起名免费起名恶人报喜电影起重链条厂家前20名排名王和王怎么起名称全国退票1.15亿张街舞团队名字起名 姓雷男属虎的人起公司名字用什么字起名沫字的寓意给宾馆起名字的农村工作会议农资取名起名大全苗苗个人资料简介初犬张姓女马宝宝起名我只要我们在一起豆腐起名高山大学金庸群侠传4教资面试试讲磕巴能过吗鼠标左键不灵敏爆笑宠妃:爷我等你休妻曹起名男孩名子大全英文诗dotaimbaai地图下载淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化