Spark的调度

作业调度简介

设计者将资源进行不同粒度的抽象建模,然后将资源统一放入调度器,通过一定的算法进行调度,最终要达到高吞吐或者低访问延时的目的。

Spark在各种运行模式中各个角色实现的功能基本一致,只不过是在特定的资源管理器下使用略微不同的名称和调度机制。


Application调度

一个Application中包含多个Job,每个Job包含多个Stage,每个Stage包含多个Task,那么Application之间如何调度?多个Job之间如何调度?多个Stage之间如何调度?Task之间延时调度机制?

1.Application调度就是组由用户提交到SparK中的作业集合,通过一定的算法,对每个按一定次序分配集群中资源的过程。
例如:
FIFO模式,用户先提交的作业1优先分配需要的资源,之后提交的作业2再分配资源,依次类推。

Application的调度模式:
Standalone:FIFO模式
Mesos:粗粒度和细粒度模式
YARN:独占模式

Job调度

就是在Application内部的一组Job集合,在Application分配到的资源量下,通过一定的算法,对每个按一定次序分配Application中资源的过程。

例如:
FIFO模式,Job1优先分配需要的资源,之后提交的Job2再分配资源,依次类推。

TaskScheduler将任务分发到相应的节点执行。


Job的调度模式:

FIFO模式

默认情况下,Spark的调度以FIFO的方式调度Job的执行。给个Job被切分为多个Stage。Job1优先分配需要的资源,之后提交的Job2再分配资源,依次类推。如果第一个Job没有占用满所有的资源,则第二个Job还可以继续获取剩余资源,这样多个Job可以并行运行。


FAIR模式

在FAIR共享模式调试下,Spark在多个Job之间以轮询round robin方式给任务进行资源分配,所有的任务拥有大致相当的优先级来共享集群的资源。这就意味着当一个长任务正在执行时,短任务仍可以被分配到资源,提交并执行,并且获得不错的响应时间。这样就不用像以前一样需要等待长任务执行完才可以。这种调度模式适合多用户的场景。


Tasks延时调度

数据本地性:在分布式系统下,尽量避免数据在网络上传输。一个任务的执行,需要既有任务的jar包,同时还要有数据块。所有传输任务jar包即可。

Tasks延时调度机制:



### Apache Spark 调度系统的工作原理 Apache Spark调度系统是一个复杂的多层结构,负责协调任务分配、资源管理和执行计划。它主要包括两个核心组件:DAGScheduler 和 TaskScheduler。 #### DAGScheduler DAGScheduler 主要用于将逻辑上的 RDD 操作转换为物理的任务集(Stages)。当提交一个作业时,DAGScheduler 会解析依赖关系并构建有向无环图(Directed Acyclic Graph, DAG),从而决定如何划分 Stages 并生成相应的任务列表[^1]。 #### TaskScheduler TaskScheduler 则专注于具体的任务分发和执行。它与底层的 Cluster Manager 协同工作,将任务分配到各个 Worker 上运行。Cluster Manager 可能是 Standalone、YARN 或 Mesos 等不同的实现方式[^2]。 --- ### 配置 Spark 调度系统的参数 为了优化 Spark 应用程序的表现,可以通过调整一系列配置项来微调调度行为: | 参数名称 | 描述 | |----------|------| | `spark.scheduler.mode` | 定义调度模式,默认为 FIFO;也可以设置为 FAIR 来支持公平共享资源。 | | `spark.speculation` | 启用推测执行机制,检测慢速任务并重新启动副本以加速整体进度。 | | `spark.dynamicAllocation.enabled` | 开启动态资源分配功能,在负载变化时自动增减 Executors 数量[^3]。 | 以下是启用 Fair Scheduler 的示例代码片段: ```scala val conf = new SparkConf() conf.set("spark.scheduler.mode", "FAIR") ``` 对于更精细控制,还可以定义 XML 文件指定池策略,并通过 `spark.scheduler.allocation.file` 加载该文件。 --- ### 最佳实践建议 1. **合理规划分区数** 数据倾斜问题是影响性能的重要因素之一。应根据输入数据规模设定合适的 partition 值,通常推荐每核处理约 200MB~500MB 的数据。 2. **监控与日志分析** 使用内置工具如 Web UI 查看实时指标,及时发现瓶颈所在。此外,记录详细的调试信息有助于排查异常情况。 3. **充分利用缓存机制** 对频繁访问的数据集应用持久化操作 (`persist()` / `cache()`) ,减少重复计算开销。 4. **平衡内存分配** 根据实际需求调整 executor-memory 和 driver-memory 大小,避免 OOM 错误发生的同时提高吞吐率。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值