Spark 资源调度及任务调度
1、 资源分配
通过SparkSubmit进行提交应用后,首先会创建Client将应用程序(字节码文件.class)包装成Driver,并将其注册到Master。Master收到Client的注册请求后将其加入待调度队列waitingDrivers,并等待分配执行资源。
1.1 Dirver调度(分配Driver执行容器,1个)
Master中调度程序执行时会为Driver分配一满足其执行要求的Worker, 并通知Worker启动将Driver。Worker接到执行Driver指令后创建DriverRunner执行Driver(应用程序mainClass,mainClass执行时其会创建Spark执行上下文环境:SparkContext。伴随SparkContext会创建DAGScheduler和TaskScheduler分别用于Stage调度和任务调度,并会触发RDD的Action算子提交job)。
1.2 APP调度(分配Executor, 多个)
若想Job运行就需要得到执行资源,Dirver成功执行后,会通过SparkDeployScheduler-Backend创建AppClient(包装App信息,包含可以创建CoarseGrainedExecutorBackend实例Command),用于向Master汇报资源需求。Master接到AppClient的汇报后,将其加入waittingApps队列,等待调度。
App调度时会为app分配满足条件的资源-----Worker(State是Alive,其上并没有该Application的executor,可用内存满足要求(spark.executor.memory指定,默认512), 核满足要求(spark.cores.max, 最大可用core数,若未指定,则为全部资源)),然后通知Woker启动Excutor. 及向AppClient发送ExecutorAdded消息。
进行调度时,调度程序会根据配制SpreadOutApps = spark.deploy.spreadOut情况决定资源分配方式,若
SpreadOutApps方式:将每个app分配到尽可能多的worker中执行。
1 从列表中取下一app,根据CPU情况找出合适的woker,按核从小到大排序
2 如果worker节点存在可以分配的core 则进行预分配处理(轮循一次分一个直至满足app需求),并在分配列表(assigned = Array[Int](numUsable))中记数。
3根据assinged列表中的预分配信息,进行分配Executor(真实分配)
4 启动Executor并设置app.state = ApplicationState.RUNNING
非SpreadOutApps方式: 将每个app分配到尽可能少的worker中执行。
1 从可用的worker列表中取下一work. (worker <- workers if worker.coresFree > 0)
2 遍历waitingApps 找到满足app运行条件的app,进行分配
3启动Executor(launchExecutor(w,e))并设置app.state = ApplicationState.RUNNING
其中:launchExcutor(worker, exec) 具体内容如下:
向executor分配给worker
通知worker启动executor
由分配过程可知, 分配的Excutor个数与CPU核心数有关。当指定完Worker节点后,会在Worker节点创建ExecutorRunner,并启动,执行App中的Command 去创建并启动CoarseGrainedExecutorBackend。CoarseGrainedExecutorBackend启动后,会首先通过传入的driverUrl这个参数向在CoarseGrainedSchedulerBackend::DriverActor(用于与Master通信,及调度任务)发送RegisterExecutor(executorId, hostPort, cores),DriverActor会创建executorData(executor信息)加入executorDataMap供后续task使用,并回复RegisteredExecutor,此时CoarseGrainedExecutorBackend会创建一个org.apache.spark.executor.Executor。至此,Executor创建完毕。Executor是直接用于task执行, 是集群中的直接劳动者。
至此,资源分配结束。当分配完资源后,就可以为依本地性为任务分配具体的执行资源。
2、Stage划分
当执行mainClass时,执行到RDD的action算子时,会触发执行作业(sc.runJob),最终通过调用DAGScheduler的runJob方法根据RDD信息及action算子要做的操作创建ResultStage(FinalStage)及ActiveJob。
若ResultStage创建成功的话,根据配制信息及RDD特征可分为本地执行,集群执行。
若“spark.localExecution.enable”指定允许本地运行(默认为:false,不允许),具RDD的action算了允许本地运行allowLocal=true,且RDD只有一个partition的话可以直接以本地线程执行job,无需划分stage。否则要将job分成多个Stage提交到集群去执行(通过提交ResultStage进行)。
因为ResultStage提交时,首先会去判断其是否存在缺失的ParentStage(也就是说是否存在未完成的父Stage)。若有,则其需要等待其父Stage执行完成,才能进行提交执行。
判断是否存在Stage的标准是看是否存在ShuffeDependency(Stage的分界线)。提交ResultStage时会根据其finalRDD 的依赖递归的寻找其DAG图中是否存在ShuffeDependency, 若存在,则创建ShuffleMapStage做为finalStage的父Stage以此类似。但至此,只能说存在父Stage并不能说存在缺失的父Stage. 判断缺失的标准是看其结果成功的输出信息(status)个数与其处理的分区个数是否相同,如若相同,则说明父Stage已经执行完成, 不存在missing;否则,说明还未完成,存在missing. 因为将ShuffleMapStage划分成maptask时,每个Partition对应一个maptask, 每个task会得到一个status输出结果信息,并在执行结束时将输出结果上报mapOutputTracker,并更新shuffleStage状态(将status增加进行其outputLocs列表,并将numAvailableOutputs加1),若numAvailableOutputs 与 Stage所要处理的partitions一致,说明所有的task都已经执行完成,即Stage执行完成;否则,说明还有task未完成,即Stage未完成。
由上述分析可知,存在依赖关系的两个Stage,如果父Stage未执行完成,子Stage不能提交,也就是不能转变为Taskset加入任务调度队列。因此其先后顺序是严格控制的。我们知道只有存在ShuffleDependency时,才会划分Stage,这也就是说两个Stage之间是要做Shuffle操作的。根据上述分析可知Shuffle时ShuffleWrite做不完,ShuffleRead不能进行.
3. Task调度
当Stage不存在缺失的ParentStage时,会将其转换为TaskSet并提交。转换时依Stage类型进行转换:将ResultStage转换成ResultTask,
ShuffleMapStage转换成ShuffleMapTask. Task个数由Stage中finalRDD 的分区数决定。
当转换成的TaskSet提交之后,将其通过taskScheduler包装成TaskSetManager并添加至调度队列中(Pool),等待调度。在包装成TaskSetManager时,根据task的preferredLocatitions将任务分类存放在pendingTasksForExecutor,
pendingTaskForHost, pendingTasksForRack,
pendingTaskWithNoPrefs及allPendingTasks中,
前三个列表是是包含关系(本地性越来越低),范围起来越大,例如:在pendingTasksForExecutor也在pendingTaskForHost,pendingTasksForRack中, 分类的目的是在调度时,依次由本地性高à低的查找task。
在进行Task调度时,首先根据调度策略将可调度所有taskset进行排序,然后对排好序的taskset待调度列表中的taskset,按序进行分配Executor。再分配Executor时,然后逐个为Executor列表中可用的Executor在此次选择的taskset中按本地性由高到低查找适配任务。此处任务调度为延迟调度,即若本次调度时间距上一任务结束时间小于当前本地性配制时间则等待,若过了配制时间,本地性要求逐渐降低,再去查找适配的task。当选定某一task后后将其加入runningtask列表,当其执行完成时会加入success列表,下次调度时就会过滤过存在这两个列表中的任务,避免重复调度。
当一个任务执行结束时,会将其从runningtask中移除,并加入success,并会适放其占用的执行资源,供后序task使用,
将判断其执行成功的task数与此taskset任务总数相等时,意为taskset中所有任务执行结束,也就是taskset结束。此时会将taskset移除出可调度队列。
重复上述过程直到taskset待调度列表为空。即所有作业(job)执行完成。
3.1 spark调度策略
上文任务调度时提到,在调度任务时,首先后依据调度策略对任务按优先级进行排序。下面就调度策略就行介绍。
Spark现有的调度策略有FIFO 及 Fair两种。采用何种调度策略由“spark.scheduler.mode”参数指定,默认为FIFO类型。
下小节进行分析……
……………………
文章出处:http://www.cnblogs.com/barrenlake/p/4550800.html
……………………
Spark 资源调度及任务调度的更多相关文章
- 【Spark篇】---Spark资源调度和任务调度
一.前述 Spark的资源调度是个很重要的模块,只要搞懂原理,才能具体明白Spark是怎么执行的,所以尤其重要. 自愿申请的话,本文分粗粒度和细粒度模式分别介绍. 二.具体 Spark资源调度流程图: ...
- 【Spark-core学习之六】 Spark资源调度和任务调度
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 scala-2.10.4(依赖jdk1.8) spark ...
- Spark 资源调度 与 任务调度
Spark 资源调度与任务调度的流程(Standalone): 启动集群后, Worker 节点会向 Master 节点汇报资源情况, Master掌握了集群资源状况. 当 Spark 提交一个 Ap ...
- Spark资源调度及任务调度
1. 资源分配 通过SparkSubmit进行提交应用后,首先会创建Client将应用程序(字节码文件.class)包装成Driver,并将其注册到Master.Master收到Client的注册请 ...
- Spark资源调度和任务调度
一.资源调度&任务调度 1.启动集群后,Worker节点会周期性的[心跳]向Master节点汇报资源情况,Master掌握集群资源情况. 2.当Spark提交一个Application后,根据 ...
- Spark Core_资源调度与任务调度详述
转载请标明出处http://www.cnblogs.com/haozhengfei/p/0593214ae0a5395d1411395169eaabfa.html Spark Core_资源调度与任务 ...
- Spark Core 资源调度与任务调度(standalone client 流程描述)
Spark Core 资源调度与任务调度(standalone client 流程描述) Spark集群启动: 集群启动后,Worker会向Master汇报资源情况(实际上将Worker的资 ...
- spark 图文详解:资源调度和任务调度
讲说spark的资源调度和任务调度,基本的spark术语,这里不再多说,懂的人都懂了... 按照数字顺序阅读,逐渐深入理解:以下所有截图均为个人上传,不知道为什么总是显示别人的QQ,好尴尬,无所谓啦, ...
- [Spark内核] 第31课:Spark资源调度分配内幕天机彻底解密:Driver在Cluster模式下的启动、两种不同的资源调度方式源码彻底解析、资源调度内幕总结
本課主題 Master 资源调度的源码鉴赏 [引言部份:你希望读者看完这篇博客后有那些启发.学到什么样的知识点] 更新中...... 资源调度管理 任务调度与资源是通过 DAGScheduler.Ta ...
随机推荐
- HDOJ 1287 破译密码(异或运算)
Problem Description 有个叫"猪头帮"的国家,采用一种简单的文法加密,他们所用的语言里面只有大写字母,没有其他任何字符:现在还知道他们加密的方法是:只用一个大写字 ...
- Cocoa Touch 层
Cocoa Touch层包含创建 iOS应用程序所需的关键框架.上至实现应用程序可视界面,下至与高级系统服务交互,都需要该层技术提供底层基础.在开发应用程序的时候,请尽可能不要使用更底层的框架,尽可能 ...
- AutoCompleteTextView ArrayAdapter
AutoCompleteTextView 继承于EditText,拥有EditText所有属性和方法 在输入框中输入我们想要输入的信息就会出现其他与其相关的提示信息 首先在activity_mai ...
- AsMVC:一个简单的MVC框架的Java实现
当初看了<从零开始写一个Java Web框架>,也跟着写了一遍,但当时学艺不精,真正进脑子里的并不是很多,作者将依赖注入框架和MVC框架写在一起也给我造成了不小的困扰.最近刚好看了一遍sp ...
- centos6 Cacti部署文档
centos6 Cacti部署文档 1.安装依赖 yum -y install mysql mysql-server mysql-devel httpd php php-pdo php-snmp ph ...
- asp.net设置元素css的属性
controls.style.Add("css名称","css值") 添加class规则 control.cssclass="str_cssname& ...
- 小学生之Java中迭代器实现的原理
一. 引言 迭代这个名词对于熟悉Java的人来说绝对不陌生.我们常常使用JDK提供的迭代接口进行java collection的遍历: Iterator it = list.iterator();wh ...
- asp.net微信开发第三篇----自定义会话管理
和微信用户的沟通少不了,总觉得看起来微信官网后台管理中的会话回复消息有点呆板,所以我这里就自定义了一个会话管理功能,最终效果图如下: 因为我试使用富文本文件CKEDITOR来进行编写,你看到稳中可能会 ...
- MeasureSpec学习
在自定义View和ViewGroup的时候,我们经常会遇到int型的MeasureSpec来表示一个组件的大小,这个变量里面不仅有组件的尺寸大小,还有大小的模式. 这个大小的模式,有点难以理解.在系统 ...
- SQL从入门到基础 - 04 SQLServer基础2(数据删除、数据检索、数据汇总、数据排序、通配符过滤、空值处理、多值匹配)
一.数据删除 1. 删除表中全部数据:Delete from T_Person. 2. Delete 只是删除数据,表还在,和Drop Table(数据和表全部删除)不同. 3. Delete 也可以 ...