本课主题

  • Master 资源调度的源码鉴赏  

资源调度管理

  1. 任务调度与资源是通过 DAGScheduler、TaskScheduler、SchedulerBackend 等进行的作业调度
  2. 资源调度是指应用程序如何获得资源
  3. 任务调度是在资源调度的基础上进行的,没有资源调度那么任务调度就成为了无源之水无本之木

Master 资源调度的源码鉴赏

  1. 因为 Master 负责资源管理和调度,所以资源调度方法 scheduer 位于 Master.scala 这个类中,当注册程序或者资源发送改变的时候都会导致 Scheduler 的调用,例如注册的时候。

    当这个应用程序向 Master 注册的时候,会把 ApplicationInfo 的信息放在一个 case class 里,过程中会新增新的 AppId,当注册的时候会分发给不同的数据结构记录起来,比如说 idToApp、endpointToApp、



  2. Scheduler 调用的时机,每次都有新的应用程序提交或者集群資源狀況发生改变的时候(包括 Executor 增加或者減少、Worker 增加或者減少等)具体代码运行顺序:scheduler( ) --> Random.shuffle( ) --> 有一个for循环过滤出ALIVE的Worker --> 过滤出付合Memory和Cores的Worker --> 然后调用 lanuchDriver( ) --> startExecutorsOnWorker( )

    WorkerState 有以下几种:ALIVE, DEAD, DECOMMISSIONED, UNKNOWN
    • 当前 Master 必需是 Alive 的方式才可以进行资源调度,一开始的时候会判断一下状态,如果不是 Alive 的状态会直接返回,也就是 StandByMaster 不会进行 Application 的资源调用
    • 使用 Random.shuffle 把 Master 中保留的集群中所有 Worker 的信息随机打乱;其算法內部是循环随机交换所有 Worker 在 Master 緩存的數数据结构中的位置
    • 接下来要判断所有 Worker 中哪些是 ALIVE 级別的 Worker 才能夠参与资源的分配工作
    • 当 SparkSubmit 指定 Driver 在 Cluster 模式的情況下,此时 Driver 会加入 waitingDrivers 等待列表中,在每个 DriverInfo 中的 DriverDescription 中要启动 Driver 时候对 Worker 的內存及 CPU 要求等內容:

    • 在符合资源要求的情況下然后采用随机打乱后的的一个 Worker 来启动 Driver,Master 发指令给 Worker 让远程的 Worker 启动 Driver,这就可以保证负载均衡。先启动 Driver 才会发生后续的一切的资源调度的模式

正式启动在Worker中启动Executor

Spark 默认为应用程序启动 Executor 的方式是 FIFO 的方式,也就是说所有的提交的应用程序都是放在调度的等待队列中的,先进先出,只有满足了前面应用程序的分配的基础上才能夠满足下一各应用程序资源的分配。正式启动在Worker中启动Executor:为应用程序具体分配 Executor 之前要判断应用程序是否还需要分配 core 如果不需要则不会会应用程序分配 Executor

  • 具体分配 Executor 之前要求 Worker 必需是 Alive 的状态且必需满足 Application 对每个 Executor 的內存和 Cores 的要求,并且在此基础上进行排序,谁的 Cores 多就排在前面。计算资源由大到小的 usableWorkers 数据库结构。把最好的资源放在前面。


    在 FIFO 的情況下默认是 spreadOutApps 来让应用程序尽可能多的运行在所有的 Node 上。
  • 然后调用 scheduleExecutorsOnWorkers 方法,为应用程序分配 executor 有两种情況,第一种方式是尽可能在集群的所有 Worker 上分配 Executor ,这种方式往往会来带潜在的更好的数据本地性。具体在集群上分配 Cores 的时候会尽可能的满足我们的要求,如果是每个 Worker 下面只能够为当前的应用程序分配一个 Executor 的话,每次是分配一个 Core! (每次为这个 Executor 增加一个 Core)。每次给 Executor 增加的时候都是增加一个 Core, 如果是 spreadout 的方式,循环一轮下一轮,假设有4个 Executors,如果 spreadout 的方式,它会在每个 Worker 中启动一个 Executor,  第一次为每个 Executor 分配一个线程,第二次再次循环后再分配一个线程。
  • 然后调用 allocateWorkerResourceToExecutors 方法
  • 然后会调用 addExecutor 方法 

  • 新增 Executor 后然后就真正的启动 Executor,准备具体要为当前应用程序分配的 Executor 信息后,Master 要通过远程通信发指令给 Worker 來具体启动 ExecutorBackend 进程,紧接给我们应用程序的 Driver 发送一个 ExecutorAdded 的信息。(Worker收到由Master发送LaunchExector信息之后如何处理可以参考我的下一篇博客!)


    LaunchExecutor case class 数据结构,Master 会把这个数据发送到 Worker 

    Master 会把这个数据发送到 Driver 

[总结部份]

更新中......

Spark资源调度分配内幕天机彻底解密:Driver在Cluster模式下的启动、两种不同的资源调度方式源码彻底解析、资源调度内幕总结的更多相关文章

  1. [Spark内核] 第31课:Spark资源调度分配内幕天机彻底解密:Driver在Cluster模式下的启动、两种不同的资源调度方式源码彻底解析、资源调度内幕总结

    本課主題 Master 资源调度的源码鉴赏 [引言部份:你希望读者看完这篇博客后有那些启发.学到什么样的知识点] 更新中...... 资源调度管理 任务调度与资源是通过 DAGScheduler.Ta ...

  2. Apache Spark源码走读之19 -- standalone cluster模式下资源的申请与释放

    欢迎转载,转载请注明出处,徽沪一郎. 概要 本文主要讲述在standalone cluster部署模式下,Spark Application在整个运行期间,资源(主要是cpu core和内存)的申请与 ...

  3. spark yarn cluster模式下任务提交和计算流程分析

    spark可以运行在standalone,yarn,mesos等多种模式下,当前我们用的最普遍的是yarn模式,在yarn模式下又分为client和cluster.本文接下来将分析yarn clust ...

  4. Spark Streaming源码解读之JobScheduler内幕实现和深度思考

    本期内容 : JobScheduler内幕实现 JobScheduler深度思考 JobScheduler 是整个Spark Streaming调度的核心,需要设置多线程,一条用于接收数据不断的循环, ...

  5. netty源码解解析(4.0)-23 ByteBuf内存管理:分配和释放

    ByteBuf内存分配和释放由具体实现负责,抽象类型只定义的内存分配和释放的时机. 内存分配分两个阶段: 第一阶段,初始化时分配内存.第二阶段: 内存不够用时分配新的内存.ByteBuf抽象层没有定义 ...

  6. Spark基本工作流程及YARN cluster模式原理(读书笔记)

    Spark基本工作流程及YARN cluster模式原理 转载请注明出处:http://www.cnblogs.com/BYRans/ Spark基本工作流程 相关术语解释 Spark应用程序相关的几 ...

  7. (升级版)Spark从入门到精通(Scala编程、案例实战、高级特性、Spark内核源码剖析、Hadoop高端)

    本课程主要讲解目前大数据领域最热门.最火爆.最有前景的技术——Spark.在本课程中,会从浅入深,基于大量案例实战,深度剖析和讲解Spark,并且会包含完全从企业真实复杂业务需求中抽取出的案例实战.课 ...

  8. spark源码解析大全

      第1章 Spark 整体概述 1.1 整体概念   Apache Spark 是一个开源的通用集群计算系统,它提供了 High-level 编程 API,支持 Scala.Java 和 Pytho ...

  9. spark源码分析以及优化

    第一章.spark源码分析之RDD四种依赖关系 一.RDD四种依赖关系 RDD四种依赖关系,分别是 ShuffleDependency.PrunDependency.RangeDependency和O ...

随机推荐

  1. 深入理解子元素的width与父元素的width关系

    深入理解父元素与子元素的width关系 对于这一部分内容,如果理解准确,可以更容易控制布局,节省不必要的代码,这里将简单研究. 第一部分:父子元素都是内联元素 代码演示如下: <!DOCTYPE ...

  2. TortoiseGit学习系列之TortoiseGit是什么?

    写该文章目的 肯定有人会遇到这样的问题: 最近换了一份新工作,新公司的源码管理都是使用GIT,习惯了之前的TFS和SVN进行项目源码管理和团队开发,第一次使用GIT进行团队开发和源码管理,颇有一些不习 ...

  3. unity物理学材质Physic Material

    物理材料 切换到脚本   在物理学材料是用来调整摩擦和碰撞对象的反弹效应. 要创建物理材质,请从菜单栏中选择“ 资源”>“创建”>“物理材质 ”.然后将“物理材质”从“项目视图”拖动到场景 ...

  4. CCF 出现次数最多的数 201312-1

    出现次数最多的数 问题描述 试题编号: 201312-1 试题名称: 出现次数最多的数 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 给定n个正整数,找出它们中出现次数最多的 ...

  5. 九度oj 1001 A+B for Matrices 2011年浙江大学计算机及软件工程研究生机试真题

    题目1001:A+B for Matrices 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:15235 解决:6172 题目描述: This time, you are supposed ...

  6. 100行代码搞定抖音短视频App,终于可以和美女合唱了。

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由视频咖 发表于云+社区专栏 本文作者,shengcui,腾讯云高级开发工程师,负责移动客户端开发 最近抖音最近又带了一波合唱的节奏,老 ...

  7. 关于React Hooks,你不得不知的事

    React Hooks是React 16.8发布以来最吸引人的特性之一.在开始介绍React Hooks之前,让咱们先来理解一下什么是hooks.wikipedia是这样给hook下定义的: In c ...

  8. .net core 部署到IIS上 HTTP Error 502.5 - ANCM Out-Of-Process Startup Failure

    安装AspNetCoreModule托管模块后执行 1.net stop was /y 2.net start w3svc

  9. c#中的程序集

     程序集:一些相关类的包,比如三层中Model层都是一些数据库表的实体类.我们所用到的类都是位于各个程序集中,若需要调用某个类,就必须引用其所在的程序集. 访问级别:程序集中的类有四种访问级别,int ...

  10. HTTP 错误 404.11 - Not Found 请求筛选模块被配置为拒绝包含双重转义序列的请求。

    一些URL中可能会包含+号等符号,然后IIS7以上的版本会默认拒绝请求此URL,需要进行如下的修改. <configuration> <system.webServer> &l ...