我是靠谱客的博主 缓慢皮卡丘,最近开发中收集的这篇文章主要介绍“戏”说spark---资源调度和任务调度,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

“戏”说spark---资源调度和任务调度
简单回顾
在“戏”说Spark-spark运行模式简解一文中不管是以client或者是以cluster的方式提交到Standalone上还是提交到yarn上,我们就概括性的描述了提交运行的流程,大概就是创建Driver,申请资源,分发任务,执行任务,返回结果这么一个过程。在“戏”说Spark-Spark核心-Stage划分及Pipline的计算模式一文中,我们详细的了解了RDD宽窄依赖的划分是为了Stage的划分,Stage的划分是为了实现再依赖组成的stage里面的Pipline的计算模型,那Spark是怎么实现资源的调度和任务的调度的呢?其中实现的细节是什么呢?这个就是我们今天需要解决的问题。
基本概念术语
首先,先再深一步的理解一下Spark中的专业的术语,概念

我们从大的层面到小的层面详细的再介绍下:
任务层面的:
Application:应用程序,包含一个Driver Program和若干个Executor程序
Job: 包含多个Task组成的并行计算,往往由Spark Action触发生成, 一个Application中往往会产生多个Job
RDD:Spark的基本计算单元,一组RDD可形成执行的有向无环图RDD Graph。
Stage: 每个Job会被拆分成多组Task, 作为一个TaskSet, 其名称为Stage,Stage的划分和调度是有DAGScheduler来负责的,Stage有非最终的Stage(Shuffle Map Stage)和最终的Stage(Result Stage)两种,Stage的边界就是发生shuffle的地方
Task: 被送到某个Executor上的工作单元,但hadoopMR中的MapTask和ReduceTask概念一样,是运行Application的基本单位,多个Task组成一个Stage,而Task的调度和管理等是由TaskScheduler负责
任务配置及调度操作层面:
SparkContext:应用程序的入口,负责调度各个运算资源,非常重要,在Driver JVM进程中创建
SparkConf:负责存储配置信息。
DAG Scheduler:实现将Spark作业分解成一到多个Stage,每个Stage根据RDD的Partition个数决定Task的个数,然后生成相应的Task set放到TaskScheduler中。
TaskScheduler:将任务(Task)分发给Executor执行。
Transformations:转换(Transformations) (如:map, filter, groupBy, join等),Transformations操作是Lazy的,也就是说从一个RDD转换生成另一个RDD的操作不是马上执行,Spark在遇到Transformations操作时只会记录需要这样的操作,并不会去执行,需要等到有Actions操作的时候才会真正启动计算过程进行计算。
Actions:操作(Actions) (如:count, collect, save等),Actions操作会返回结果或把RDD数据写到存储系统中。Actions是触发Spark启动计算的动因。
资源调度和任务调度详细流程

DAGScheduler:任务调度器的高层调度对象,TaskScheduler:任务调度的底层调度器。
我们从RDD的层面来解析:
1.创建 RDD 对象,一组RDD Objects之间的依赖关系构成有向无环图DAG
2.将DAG交给DAGSheduler,每一个JOB被DAGSheduler根据RDD之间的宽窄依赖切分多个Stage,Stage里面就是一堆并行计算的task,这堆task组成taskSet集合,每个Stage其实就是一个TaskSet
3.将TaskSet交给TaskScheduler,TaskScheduler遍历TaskSet将Task发送到数据所在的节点的Executor里面的线程池中运行。
图解资源调度和任务调度流程
现在我们以图文并茂的方式展现资源的申请和任务的调度的过程:

1.构建Spark Application的运行环境(启动SparkContext),SparkContext向资源管理器(可以是Standalone、Mesos或YARN)注册并申请运行Executor资源;
2.资源管理器分配Executor资源并启动StandaloneExecutorBackend,Executor运行情况将随着心跳发送到资源管理器上;
3.SparkContext构建成DAG图,将DAG图分解成Stage,并把Taskset发送给Task Scheduler。Executor向SparkContext申请Task,Task Scheduler将Task发放给Executor运行同时SparkContext将应用程序代码发放给Executor。
4.Task在Executor上运行,运行完毕释放所有资源。
注意:
(1).不同的应用程序之间有各自独立的一批Executor共用
(2).Worker向Master发送心跳,心跳的信息是不包含资源的情况的,只包含workerid,因为Spark自带的资源管理框架是粗粒度的资源申请
(3).Driver进程是一个JVM进程,通过执行提交命令--class jar里面的main函数启动的,进程里面创建了sparkconf对象和sparkContext对象,而sparkContext对象里创建了任务调度的DAGScheduler和TaskScheduler,而TaskScheduler创建后会向Master发送一个请求,为当前的Application申请资源(所需要的资源在conf中设置或者通过--Executor-cores或者--Executor-memory设置,如没设置使用默认值,默认值是1核1G内存)
(4).new SparkContext(conf)经历了资源的申请,并拿到资源列表的过程
(5).DAG的绘制是在遇到遇到Action类的算子执行的
(6).资源管理器即资源管理框架,有standalone和yarn,mesos等,都有Client的应用程序的提交方式和Cluster的提交方式,区别只是Driver所在的位置不同而已。具体详情请参考:“戏”说Spark-spark运行模式简解
细节把握
retry failed or straggling tasks:重试机制和推测执行机制
重试机制:
如果task在线程池中运行失败,TaskScheduler将重试三次,如果TaskScheduler重试失败的task 3次依然失败,那么DAGScheduler将重新发送Stage,这个将重试4次,如果还失败,那么这个Job就失败了,相应的Application就失败了。因此一个task默认情况下重试3*4=12次。这个就叫做Spark的重试机制
注意:
如果task失败是由于 shuffle file not find造成的,那么TaskScheduler是不负责重试的,直接进行stage重试。
推测执行机制:
straggling tasks的Task就是运行缓慢的task,我们称其为“挣扎”的task
推测执行机制:“挣扎”的Task TaskScheduler将会重启一个新的处理逻辑一样的Task来交给Executor处理,“挣扎”的Task和新的Task会比赛,谁先运行结束,以谁的运行结果为准。
推测执行机制默认是关闭的
经验提示:
ETL类型的业务需要将推测执行机制关闭:原因是不断往数据库中插入数据,造成数据的重复
当数据倾斜遇到推测执行的时候,计算将会变得异常的缓慢,需要将推测执行机制关闭
粗粒度的资源申请和细粒度的资源申请
粗粒度的资源申请-----以Standalone为代表
在Application执行之前,将所有的资源申请完毕,当资源申请成功后才会进行任务的调度,当所有的task执行完毕后,才会释放这部分资源
优点:在Application执行之前,资源全部申请好,每个Task直接使用资源就好了,不需要task自己去申请资源,task的启动变快,Stage计算变快,job计算变快,application计算变快
缺点:直到最后一个task执行完后才释放资源,集群的资源无法充分的利用
细粒度的资源申请-----以MR为代表
在Application执行之前,不需要先去申请资源,直接执行,让里面的每一个task自己去申请,申请到了资源,task就执行,task执行完毕就释放资源
优点:申请完资源,执行完就释放,资源能够充分的使用
缺点:task启动就慢,Application执行就慢
注意:粗粒度的资源申请和细粒度的资源申请针对的是实现ApplicationMaster的方式是粗粒度的还是细粒度来定义的
spark跑在yarn上,资源的申请依靠ApplicationMaster,Spark实现ApplicationMaster是以粗粒度的方式实现的资源的申请
MR跑在yarn上,资源的申请依靠 ApplicationMaster,MR实现ApplicationMaster是以细粒度的方式实现的资源的申请
WordCount资源的调度和任务调度图
最后我们以WordCount为例,画画资源的调度和任务的调度图

总结:
在Spark的资源的调度和任务的调度中,SparkContext扮演者重要的作用,作为应用程序的入口,负责和Master通信并且完成资源的申请,并且创建出任务调度的高层调度对象DAGScheduler和底层调度对象TaskScheduler,完成了任务的切分Stage,并行化的TaskSet,并发送给申请好的资源执行,回收执行完的结果,而其中DAGScheduler和TaskScheduler的工作即我们在“戏”说Spark-Spark核心-Stage划分及Pipline的计算模式一文中所详细讲解的内容。在任务的执行的过程中Spark还提供了重试机制和推到执行等机制,但是在使用这些机制的过程中需要注意一些细节问题。
思维导图构建你的知识架构:

最后

以上就是缓慢皮卡丘为你收集整理的“戏”说spark---资源调度和任务调度的全部内容,希望文章能够帮你解决“戏”说spark---资源调度和任务调度所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部