- 浏览: 599327 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (669)
- oracle (36)
- java (98)
- spring (48)
- UML (2)
- hibernate (10)
- tomcat (7)
- 高性能 (11)
- mysql (25)
- sql (19)
- web (42)
- 数据库设计 (4)
- Nio (6)
- Netty (8)
- Excel (3)
- File (4)
- AOP (1)
- Jetty (1)
- Log4J (4)
- 链表 (1)
- Spring Junit4 (3)
- Autowired Resource (0)
- Jackson (1)
- Javascript (58)
- Spring Cache (2)
- Spring - CXF (2)
- Spring Inject (2)
- 汉字拼音 (3)
- 代理模式 (3)
- Spring事务 (4)
- ActiveMQ (6)
- XML (3)
- Cglib (2)
- Activiti (15)
- 附件问题 (1)
- javaMail (1)
- Thread (19)
- 算法 (6)
- 正则表达式 (3)
- 国际化 (2)
- Json (3)
- EJB (3)
- Struts2 (1)
- Maven (7)
- Mybatis (7)
- Redis (8)
- DWR (1)
- Lucene (2)
- Linux (73)
- 杂谈 (2)
- CSS (13)
- Linux服务篇 (3)
- Kettle (9)
- android (81)
- protocol (2)
- EasyUI (6)
- nginx (2)
- zookeeper (6)
- Hadoop (41)
- cache (7)
- shiro (3)
- HBase (12)
- Hive (8)
- Spark (15)
- Scala (16)
- YARN (3)
- Kafka (5)
- Sqoop (2)
- Pig (3)
- Vue (6)
- sprint boot (19)
- dubbo (2)
- mongodb (2)
最新评论
一、引子
在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上去
Executor资源调度:
Spark默认提供了一种在各个节点进行round-robin的调度,用户可以自己设置这个flag
在介绍之前我们先介绍一个概念,
可用的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。
}
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
在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 会把数据都载入到内存吗
2017-06-01 10:14 817前言 很多初学者其实对Spark的编程模式还是RDD这个概念理 ... -
Spark 实现TopN的问题(groupBy)
2017-05-31 14:11 1402t2.txt ab 11 ab 23 ab 13 a ... -
Spark block和partition的区别
2017-05-31 13:48 978hdfs中的block是分布式存储的最小单元,类似于盛放文件的 ... -
Spark 什么是DAG(有向无环图)(窄依赖和宽依赖)
2017-05-26 16:46 2154在Spark里每一个操作生成一个RDD,RDD之间连一条边,最 ... -
Spark 为什么比Hadoop快
2017-05-25 16:12 1336Spark SQL比Hadoop Hive快, ... -
Spark 集群的搭建(1.6.3)
2017-05-24 10:41 8参考内容:http://www.cnblogs.com/one ... -
Spark shuffle实现详细探究学习
2017-04-28 15:08 572Background 在MapReduce框架中,shuffl ... -
Spark collect和take函数学习(RDD-->Array)
2017-04-27 15:44 2108将RDD转成Scala数组,并返回。 函数原型 def ... -
Spark MLlib平台的协同过滤算法---电影推荐系统学习
2017-04-27 15:33 626import org.apache.log4j.{Level, ... -
Spark parallelize函数和makeRDD函数的区别(Array-->RDD)
2017-04-27 14:56 832我们知道,在Spark中创建RDD的创建方式大概可以分为三种: ... -
Spark Streaming实时计算学习
2017-04-27 10:31 942随着大数据的发展,人们对大数据的处理要求也越来越高,原有的批处 ... -
Spark 集群的搭建学习(1.6.3)
2017-04-25 14:30 786Spark是一个快速、通用的计算集群框架,它的内核使用Scal ... -
Spark SQL简单示例学习
2017-04-25 14:17 761Spark SQL 作为Apache Spark大数据框架的一 ... -
Spark RDD基于内存的集群计算容错抽象(核心概念)
2017-04-11 20:09 675摘要 本文提出了分布 ... -
Spark 入门知识学习
2017-04-08 11:46 405什么是Spark Apache Spark是 ...
相关推荐
本文详细介绍了Spark集群中Executor的分配机制及其在资源管理和数据处理方面的作用。合理的Executor配置不仅可以提高任务执行效率,还能有效避免资源浪费和性能瓶颈问题。在实际部署Spark集群时,开发者应该根据具体...
此外,动态资源调度可以根据集群资源变化调整Executor数量。 9. Spark SQL与Hive集成: Spark SQL可以直接读取Hive Metastore中的表,使得Hive用户可以无缝过渡到Spark,享受Spark的高性能查询能力。 10. Spark ...
5. **任务调度**:生成TaskSet后,Driver将其交给Cluster Manager(如YARN或Mesos),Cluster Manager负责分配Executor资源。然后,TaskScheduler将TaskSet分发到Executor上执行。 6. **执行Task**:Executor接收到...
4. **Executor配置**:我们将会讨论如何调整Executor的数量、内存大小(`executor.memory`)和CPU核心数(`executor.cores`),以平衡资源利用率和任务并发度。 5. **并行度与任务粒度**:理解如何设置合适的...
掌握如何在PySpark环境中运行代码,对理解和学习Spark功能非常有帮助。 7. **Spark任务调度**:理解Spark的DAG(有向无环图)调度机制,包括Stage划分和Task生成,有助于优化大数据处理流程,提升效率。 8. **数据...
Spark的架构由Driver Program、Executor和Cluster Manager三部分组成。这部分内容会详细解释Spark的工作流程,包括Job、Stage和Task的划分,以及如何通过DAG(有向无环图)调度任务。同时,会涵盖Spark Shuffle过程...
Driver端是Spark应用程序的主控程序,负责调度任务、监控状态等。虽然Driver端内存不会直接影响性能,但在资源不足时需要适当调整: - `spark.driver.memory`设置为3GB,表示Driver端的最大Java堆内存; - `spark....
Spark的核心运行机制主要包括Spark核心组件、任务调度、内存管理和核心功能的运行原理。理解这些知识点对于开发和优化Spark应用至关重要。 1. Spark核心组件 - Driver:Spark应用的主控节点,它执行main方法,将...
Spark的核心组件包括Driver程序、Executor进程和Cluster Manager。Driver负责作业调度,Executor执行任务,而Cluster Manager管理资源分配。Spark的工作模式有本地模式、Standalone模式、YARN模式和Kubernetes模式,...
2. **Driver单点问题**:由于驱动程序需要存储大量向量序列并在每轮迭代中执行复杂的向量运算,因此对其内存和计算资源的要求非常高。 **3.2.3 Spark on Angel中的L-BFGS实现** Spark on Angel通过引入参数服务器...
《Spark编程基础及项目实践》课程的课后习题涵盖了Spark的核心概念和关键特性,旨在帮助学生深入理解和应用...在实际项目中,还需要结合具体场景,如安全性、资源调度策略以及数据处理需求等进行更深入的学习和实践。
Spark的任务调度分为Stage级调度和Task级调度: - Stage级调度由DAGScheduler负责。DAGScheduler接收Job后,根据RDD的依赖关系构造DAG图,然后将其切割成多个Stage。切割策略是通过寻找宽依赖(Shuffle依赖)来确定...
如果使用的是YARN或Mesos,还需关注资源调度器的配置,如`spark.yarn.executor.memoryOverhead`和`spark.yarn.driver.memoryOverhead`,确保有足够的额外内存用于JVM和其他开销。 6. **网络调优** - `spark....
SparkContext向资源管理器注册并申请运行Executor资源,资源管理器分配资源后启动Executor,Executor运行情况通过心跳反馈给资源管理器。在这个过程中,DAGScheduler和TaskScheduler负责任务的调度。DAGScheduler将...
Spark是大数据领域中的一款高速计算引擎,以其高效、易用和可扩展性著称。...通过深入学习Spark的Master、Worker、Driver和Executor的工作方式,以及不同集群部署模式,可以更好地理解和利用Spark的强大功能。
4. **使用动态资源调度**:启用动态资源分配(Dynamic Resource Allocation)可以在空闲时回收executor资源,提高集群利用率。 5. **调整缓存策略**:合理使用Spark的缓存机制(如memory和disk混合存储),可以减少...
2. **调度机制**:DAGScheduler和TaskScheduler的工作流程,如何调度任务到Executor。 3. **存储系统**:BlockManager如何管理内存和磁盘上的数据,以及如何与Shuffle服务交互。 4. **网络通信**:Akka在Spark中的...
Spark还支持动态资源调度,可根据任务需求自动调整资源分配。 **8. Spark编程模型** Spark提供Scala、Java、Python和R四种编程接口,允许开发者根据项目需求选择合适的语言。PySpark和SparkR方便了Python和R用户...
4. Standalone-Client模式中,Driver运行在提交任务的本地机器上,与Master通信获取Executor资源。 在两种Standalone模式中,Driver注册应用程序,Master分配Executor,Executor反向注册,然后Driver执行任务,遇到...
在部署Spark之前,需要对`conf/spark-defaults.conf`进行配置,设置诸如`spark.master`(指定运行模式和地址)、`spark.executor.instances`(执行器数量)、`spark.driver.memory`(驱动程序内存)等参数。...