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

本課主題

  • Master 资源调度的源码鉴赏

Spark 的 Worker 是基于什么逻辑去启动 Executor

资源调度管理

  1. 任務調度與資源是通過 DAGScheduler、TaskScheduler、SchedulerBackend 等進行的作業調度
  2. 資源調度是指應用程序如何獲得資源
  3. 任務調度是在資源調度的基礎上進行的,沒有資源調度那麼任務調度就成為了無源之水無本之木

Master 资源调度的源码鉴赏

  1. 因為 Master 負責資源管理和調度,所以資源調度方法 scheduer 位於 Master.scala 這個類中,當注册程序或者資源發生改變的時候都會導致 Scheduler 的調用,例如注册的時候。
  2. Scheduler 調用的時機,每次都有新的應用程序提交或者集群資源狀況發生改變的時候(包括 Executor 增加或者減少、Worker 增加或者減少等)
    • 當前 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 的信息。


    LaunchExecutor case class 数据结构

參考資料

资料来源来至 DT大数据梦工厂 第31课:Spark资源调度分配内幕天机彻底解密:Driver在Cluster模式下的启动、两种不同的资源调度方式源码彻底解析、资源调度内幕总结

时间: 2024-10-31 04:07:01

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

Driver在Cluster模式下的启动、两种不同的资源调度方式源码彻底解析、资源调度内幕总结(DT大数据梦工厂)

内容: 1.分配 Driver(Cluster): 2.为Application分配资源: 3.两种不同的资源分配方式彻底解密: 4.Spark资源分配的思考: Spark最最重要的,这个内容每个IMF成员必须掌握,后面的性能优化全部跟这个有关. ==========任务调度与资源调度的区别============ 1.任务调度是通过DAGScheduler.TaskScheduler.SchedulerBackend等进行的作业调度: 2.资源调度是指应用程序如何获取资源: 3.任务调度是在资

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

欢迎转载,转载请注明出处,徽沪一郎. 概要 本文主要讲述在standalone cluster部署模式下,Spark Application在整个运行期间,资源(主要是cpu core和内存)的申请与释放. 构成Standalone cluster部署模式的四大组成部件如下图所示,分别为Master, worker, executor和driver,它们各自运行于独立的JVM进程. 从资源管理的角度来说 Master  掌管整个cluster的资源,主要是指cpu core和memory,但Ma

SPRING技术内幕,Spring源码深度解析

 SPRING技术内幕,Spring源码深度解析 SPRING技术内幕:深入解析SPRING架构与设计原理(第2版)[带书签].pdf: http://www.t00y.com/file/78131650 Spring源码深度解析 [郝佳编著] sample.pdf: http://www.t00y.com/file/78131634 [jingshuishenliu.400gb.com]Spring Data.pdf: http://www.t00y.com/file/78256084 [

Spark 定制版:007~Spark Streaming源码解读之JobScheduler内幕实现和深度思考

本讲内容: a. JobScheduler内幕实现 b. JobScheduler深度思考 注:本讲内容基于Spark 1.6.1版本(在2016年5月来说是Spark最新版本)讲解. 上节回顾 上节课,我们以JobGenerator类为重心,为大家左右延伸,解密Job之动态生成:并总结出了Job之动态生成的三大核心: a. JobGenerator: 负责Job生成 b. JobSheduler:负责Job调度 c. ReceiverTracker:获取元数据 如Job动态生成图: 开讲 由上

Spark版本定制七:Spark Streaming源码解读之JobScheduler内幕实现和深度思考

本期内容: 1,JobScheduler内幕实现 2,JobScheduler深度思考 摘要:JobScheduler是Spark Streaming整个调度的核心,其地位相当于Spark Core上的调度中心中的DAGScheduler!           一.JobScheduler内幕实现 问:JobScheduler是在什么地方生成的? 答:JobScheduler是在StreamingContext实例化时产生的,从StreamingContext的源码第183行中可以看出:    

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

ByteBuf内存分配和释放由具体实现负责,抽象类型只定义的内存分配和释放的时机. 内存分配分两个阶段: 第一阶段,初始化时分配内存.第二阶段: 内存不够用时分配新的内存.ByteBuf抽象层没有定义第一阶段的行为,但定义了第二阶段的方法: public abstract ByteBuf capacity(int newCapacity) 这个方法负责分配一个长度为newCapacity的新内存. 内存释放的抽象实现在AbstractReferenceCountedByteBuf中实现,这个类实

(版本定制)第7课:Spark Streaming源码解读之JobScheduler内幕实现和深度思考

本期内容: 1.JobScheduler内幕实现 2.JobScheduler深度思考 JobScheduler是Spark Streaming的调度核心,地位相当于Spark Core上调度中心的DAG Scheduler,非常重要! JobGenerator每隔Batch Duration时间会动态的生成JobSet提交给JobScheduler,JobScheduler接收到JobSet后,如何处理呢? 产生Job /** Generate jobs and perform checkpo

Jvm(31),理解升级----通过JVM内存模型深入理解值传递和引用传递两种方式

值传递和引用传递分析 Java中数据类型分为两大类:基本类型和引用类型(也就是对象类型). 基本类型:boolean.char.byte.short.int.long.float.double 引用类型:类.接口.数组 因此,变量类型也可分为两大类:基本类型和引用类型. 在分析值传递和引用传递之前,建议了解下以上变量类型在Java内存管理模型中的位置,如果对此有所了解,将更加有助于理解两种传递的方式^_^ 在Java内存中,基本类型变量存储在Java栈(VM Stack)中,引用变量存储在堆(H

Spark资源调度机制源码分析--基于spreadOutApps及非spreadOutApps两种资源调度算法

Spark资源调度机制源码分析--基于spreadOutApps及非spreadOutApps两种资源调度算法 1.spreadOutApp尽量平均分配到每个executor上: 2.非spreadOutApp尽量在使用单个executor的资源. 源码分析 org.apache.spark.deploy.master.Master 1.首先判断,master状态不是ALIVE的话,直接返回2.调度driver3. Application的调度机制(核心之核心,重中之重) 源码如下: 1 /*