Spark RDD Partition和Scheduler调度的梳理

问题背景

业务同学报障,同一个Spark计算,数据源,执行代码和提交客户端配置都一模一样,第一次运行跑了几个小时没出数kill掉了,失败后第二次运行,跑了18分钟就出数了。我这边要分析一下原因,提供解决方案,避免再出现类似的问题。

说明:该记录只是问题梳理,不会涉及任何业务信息。

问题分析

对比了Spark History的详情,以及日志,发现同样的执行计划,失败的任务的Stage 的并发数是10个,成功的并发数是500个。

查看driver日志,可以知道,在跑Job 0之前,只收到了4个executor,一个executor用于运行driver,剩下三个分别是4核,4核,2核,所以一共可用的并发资源就10个,因此在Job 0的Stage 0环节开始,创建了10个task运行。查看当时的队列资源,发现当时pending:avaliable的比例是8:1,就是可用资源为1,等待资源需要8,因此资源是十分紧张的。

21/12/30 04:10:07 INFO Utils: Using initial executors = 150, max of spark.dynamicAllocation.initialExecutors, spark.dynamicAllocation.minExecutors and spark.executor.instances 
...
21/12/30 04:10:07 INFO YarnAllocator: Will request 150 executor container(s), each with 8 core(s) and 11264 MB memory (including 1024 MB of overhead) //按客户端的配置,需要150个executor,每个8核,10G内存
21/12/30 04:10:07 INFO YarnAllocator: Submitted 150 unlocalized container requests.
21/12/30 04:10:07 INFO ApplicationMaster: Started progress reporter thread with (heartbeat : 3000, initial allocation : 200) intervals
21/12/30 04:10:34 INFO YarnAllocator: Launching container container_e188_1639619541647_741615_01_000007 on host fs-hiido-dn-12-9-224.hiido.host.yydevops.com for ex
### 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、付费专栏及课程。

余额充值