`

Spark Driver和Executor资源调度学习

 
阅读更多
一、引子
  在Worker Actor中,每次LaunchExecutor会创建一个CoarseGrainedExecutorBackend进程,Executor和CoarseGrainedExecutorBackend是1对1的关系。也就是说集群里启动多少Executor实例就有多少CoarseGrainedExecutorBackend进程。
那么到底是如何分配Executor的呢?怎么控制调节Executor的个数呢?

二、Driver和Executor资源调度
下面主要介绍一下Spark Executor分配策略:
我们仅看,当Application提交注册到Master后,Master会返回RegisteredApplication,之后便会调用schedule()这个方法,来分配Driver的资源,和启动Executor的资源。
schedule()方法是来调度当前可用资源的调度方法,它管理还在排队等待的Apps资源的分配,这个方法是每次在集群资源发生变动的时候都会调用,根据当前集群最新的资源来进行Apps的资源分配。

Driver资源调度:
随机的将Driver分配到空闲的Worker上去

// First schedule drivers, they take strict precedence over applications  
val shuffledWorkers = Random.shuffle(workers) // 把当前workers这个HashSet的顺序随机打乱  
for (worker <- shuffledWorkers if worker.state == WorkerState.ALIVE) { //遍历活着的workers  
  for (driver <- waitingDrivers) { //在等待队列中的Driver们会进行资源分配  
    if (worker.memoryFree >= driver.desc.mem && worker.coresFree >= driver.desc.cores) { //当前的worker内存和cpu均大于当前driver请求的mem和cpu,则启动  
      launchDriver(worker, driver) //启动Driver 内部实现是发送启动Driver命令给指定Worker,Worker来启动Driver。  
      waitingDrivers -= driver //把启动过的Driver从队列移除  
    }  
  }  
}


Executor资源调度:
Spark默认提供了一种在各个节点进行round-robin的调度,用户可以自己设置这个flag
val spreadOutApps = conf.getBoolean("spark.deploy.spreadOut", true)  

在介绍之前我们先介绍一个概念,

可用的Worker:什么是可用,可用就是资源空闲足够且满足一定的规则来启动当前App的Executor。
Spark定义了一个canUse方法:这个方法接受一个ApplicationInfo的描述信息和当前Worker的描述信息。
1、当前worker的空闲内存比该app在每个slave要占用的内存 (executor.memory默认512M)大
2、当前app从未在此worker启动过App

总结: 从这点看出,要满足:该Worker的当前可用最小内存要比配置的executor内存大,并且对于同一个App只能在一个Worker里启动一个Exeutor,如果要启动第二个Executor,那么请到其它Worker里。这样的才算是对App可用的Worker。

/** 
 * Can an app use the given worker? True if the worker has enough memory and we haven't already 
 * launched an executor for the app on it (right now the standalone backend doesn't like having 
 * two executors on the same worker). 
 */  
def canUse(app: ApplicationInfo, worker: WorkerInfo): Boolean = {  
  worker.memoryFree >= app.desc.memoryPerSlave && !worker.hasExecutor(app)  



SpreadOut分配策略:
SpreadOut分配策略是一种以round-robin方式遍历集群所有可用Worker,分配Worker资源,来启动创建Executor的策略,好处是尽可能的将cores分配到各个节点,最大化负载均衡和高并行。

非SpreadOut分配策略:
非SpreadOut策略,该策略:会尽可能的根据每个Worker的剩余资源来启动Executor,这样启动的Executor可能只在集群的一小部分机器的Worker上。这样做对node较少的集群还可以,集群规模大了,Executor的并行度和机器负载均衡就不能够保证了。

程序运行的时候,Driver向Master申请资源;
Master让Worker给程序分配具体的Executor。
下面就是Driver具体的调用过程:
通过DAGScheduler划分阶段,形成一系列的TaskSet,然后传给TaskScheduler,把具体的Task交给Worker节点上的Executor的线程池处理。线程池中的线程工作,通过BlockManager来读写数据。
这就是4大组件:Worker、Master、Executor、Driver之间的协同工作。

转自:http://blog.csdn.net/oopsoom/article/details/38763985

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    spark:Executor分配详解

    本文详细介绍了Spark集群中Executor的分配机制及其在资源管理和数据处理方面的作用。合理的Executor配置不仅可以提高任务执行效率,还能有效避免资源浪费和性能瓶颈问题。在实际部署Spark集群时,开发者应该根据具体...

    spark笔记整理文档

    此外,动态资源调度可以根据集群资源变化调整Executor数量。 9. Spark SQL与Hive集成: Spark SQL可以直接读取Hive Metastore中的表,使得Hive用户可以无缝过渡到Spark,享受Spark的高性能查询能力。 10. Spark ...

    Spark源码分析2-Driver generate jobs and launch task

    5. **任务调度**:生成TaskSet后,Driver将其交给Cluster Manager(如YARN或Mesos),Cluster Manager负责分配Executor资源。然后,TaskScheduler将TaskSet分发到Executor上执行。 6. **执行Task**:Executor接收到...

    Python3实战Spark大数据分析及调度-第7章 Spark Core调优.zip

    4. **Executor配置**:我们将会讨论如何调整Executor的数量、内存大小(`executor.memory`)和CPU核心数(`executor.cores`),以平衡资源利用率和任务并发度。 5. **并行度与任务粒度**:理解如何设置合适的...

    Python3实战Spark大数据分析及调度-第1章 课程介绍.zip

    掌握如何在PySpark环境中运行代码,对理解和学习Spark功能非常有帮助。 7. **Spark任务调度**:理解Spark的DAG(有向无环图)调度机制,包括Stage划分和Task生成,有助于优化大数据处理流程,提升效率。 8. **数据...

    spark学习文档

    Spark的架构由Driver Program、Executor和Cluster Manager三部分组成。这部分内容会详细解释Spark的工作流程,包括Job、Stage和Task的划分,以及如何通过DAG(有向无环图)调度任务。同时,会涵盖Spark Shuffle过程...

    基于CDH 6.3.0 搭建 Hive on Spark 及相关配置和调优

    Driver端是Spark应用程序的主控程序,负责调度任务、监控状态等。虽然Driver端内存不会直接影响性能,但在资源不足时需要适当调整: - `spark.driver.memory`设置为3GB,表示Driver端的最大Java堆内存; - `spark....

    Spark内核解析.docx

    Spark的核心运行机制主要包括Spark核心组件、任务调度、内存管理和核心功能的运行原理。理解这些知识点对于开发和优化Spark应用至关重要。 1. Spark核心组件 - Driver:Spark应用的主控节点,它执行main方法,将...

    光环大数据培训spark体系学习文档

    Spark的核心组件包括Driver程序、Executor进程和Cluster Manager。Driver负责作业调度,Executor执行任务,而Cluster Manager管理资源分配。Spark的工作模式有本地模式、Standalone模式、YARN模式和Kubernetes模式,...

    Spark on Angel:Spark机器学习的核心加速器

    2. **Driver单点问题**:由于驱动程序需要存储大量向量序列并在每轮迭代中执行复杂的向量运算,因此对其内存和计算资源的要求非常高。 **3.2.3 Spark on Angel中的L-BFGS实现** Spark on Angel通过引入参数服务器...

    【Spark内核篇03】Spark任务调度机制1

    Spark的任务调度分为Stage级调度和Task级调度: - Stage级调度由DAGScheduler负责。DAGScheduler接收Job后,根据RDD的依赖关系构造DAG图,然后将其切割成多个Stage。切割策略是通过寻找宽依赖(Shuffle依赖)来确定...

    spark单节点调优

    如果使用的是YARN或Mesos,还需关注资源调度器的配置,如`spark.yarn.executor.memoryOverhead`和`spark.yarn.driver.memoryOverhead`,确保有足够的额外内存用于JVM和其他开销。 6. **网络调优** - `spark....

    《Spark编程基础及项目实践》课后习题及答案3.pdf

    《Spark编程基础及项目实践》课程的课后习题涵盖了Spark的核心概念和关键特性,旨在帮助学生深入理解和应用...在实际项目中,还需要结合具体场景,如安全性、资源调度策略以及数据处理需求等进行更深入的学习和实践。

    Spark简介以及其生态圈

    SparkContext向资源管理器注册并申请运行Executor资源,资源管理器分配资源后启动Executor,Executor运行情况通过心跳反馈给资源管理器。在这个过程中,DAGScheduler和TaskScheduler负责任务的调度。DAGScheduler将...

    Spark原理及源码剖析1

    Spark是大数据领域中的一款高速计算引擎,以其高效、易用和可扩展性著称。...通过深入学习Spark的Master、Worker、Driver和Executor的工作方式,以及不同集群部署模式,可以更好地理解和利用Spark的强大功能。

    Spark性能优化基础篇

    4. **使用动态资源调度**:启用动态资源分配(Dynamic Resource Allocation)可以在空闲时回收executor资源,提高集群利用率。 5. **调整缓存策略**:合理使用Spark的缓存机制(如memory和disk混合存储),可以减少...

    ApacheSpark设计与实现.pdf+ApacheSpark源码剖析.pdf+Spark原著中文版.pdf

    2. **调度机制**:DAGScheduler和TaskScheduler的工作流程,如何调度任务到Executor。 3. **存储系统**:BlockManager如何管理内存和磁盘上的数据,以及如何与Shuffle服务交互。 4. **网络通信**:Akka在Spark中的...

    Spark官方文档中文翻译

    Spark还支持动态资源调度,可根据任务需求自动调整资源分配。 **8. Spark编程模型** Spark提供Scala、Java、Python和R四种编程接口,允许开发者根据项目需求选择合适的语言。PySpark和SparkR方便了Python和R用户...

    【Spark内核篇02】Spark模式运行机制1

    4. Standalone-Client模式中,Driver运行在提交任务的本地机器上,与Master通信获取Executor资源。 在两种Standalone模式中,Driver注册应用程序,Master分配Executor,Executor反向注册,然后Driver执行任务,遇到...

    spark-2.3.3.zip

    在部署Spark之前,需要对`conf/spark-defaults.conf`进行配置,设置诸如`spark.master`(指定运行模式和地址)、`spark.executor.instances`(执行器数量)、`spark.driver.memory`(驱动程序内存)等参数。...

Global site tag (gtag.js) - Google Analytics