当前位置: 首页 > news >正文

Spark任务调度流程详解

1. 核心调度组件
  • DAGScheduler:负责将Job拆分为Stage,处理Stage间的依赖关系。

  • TaskScheduler:将Task分配到Executor,监控任务执行。

  • SchedulerBackend:与集群管理器(如YARN、K8s)通信,管理Executor资源。


2. 调度流程分步拆解
步骤1:用户提交代码
val rdd = sc.textFile("hdfs://data.txt").flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _)
rdd.collect()  // 触发Job提交
步骤2:生成DAG(有向无环图)
  • RDD血缘(Lineage):记录RDD的转换过程(textFile → flatMap → map → reduceByKey)。

  • 宽依赖(Shuffle)reduceByKey导致Stage划分。

步骤3:划分Stage
  • Stage 0textFile → flatMap → map(窄依赖,合并为一个Stage)。

  • Stage 1reduceByKey(宽依赖,单独一个Stage)。

步骤4:提交Task
  • Stage 0生成多个MapTaskStage 1生成多个ReduceTask

  • TaskScheduler根据数据本地性(Data Locality)分配Task到Executor。

步骤5:执行与监控
  • Executor执行Task,向Driver汇报状态。

  • 失败Task自动重试(默认重试3次)。


3. 关键概念详解
概念说明示例
Job由行动操作(如collect)触发的完整计算任务一次collect()生成一个Job
Stage由一组无Shuffle依赖的Task组成(分为ResultStageShuffleMapStagereduceByKey前为一个Stage
TaskStage中每个分区的计算单元(ShuffleMapTaskResultTask处理一个分区的数据
Shuffle跨Stage数据重分布(如groupByKeyjoinreduceByKey触发Shuffle
数据本地性优先将Task调度到数据所在节点(PROCESS_LOCAL > NODE_LOCAL > ANY读取HDFS块时优先分配到数据所在节点

4. 调度流程示意图


5. 性能优化点
  1. 减少Shuffle

    • reduceByKey替代groupByKey(提前局部聚合)。

    • 使用Broadcast Join代替Shuffle Join

  2. 调整并行度

    • 通过spark.default.parallelismrepartition()控制分区数。

  3. 数据本地性

    • 确保输入数据与Executor在同一节点(如HDFS副本策略)。

  4. 资源分配

    • 合理设置Executor内存(spark.executor.memory)和CPU核心数(spark.executor.cores)。


6. 容错机制
  • Stage重试:若某个Stage失败,重新提交该Stage的所有Task。

  • Task重试:单个Task失败后,TaskScheduler会重新调度(默认最多3次)。

  • 血缘恢复:若Executor丢失数据,根据RDD血缘重新计算。


总结

Spark的调度机制通过DAG优化、本地性优先和容错设计,实现了高效的大数据处理。理解其原理后,可通过调整分区策略、优化Shuffle操作等手段显著提升性能。

相关文章:

  • 代码随想录算法训练营第六十天| 图论7—卡码网53. 寻宝
  • 【大模型】AI智能体Coze 知识库从使用到实战详解
  • Windows使用虚拟环境执行sh脚本
  • git 报错:错误:RPC 失败。curl 28 Failed to connect to github.com port 443 after 75000
  • 48.辐射发射RE和传导发射CE测试方法分析
  • C++八股——函数对象
  • 基于大模型研究报告清单
  • 【软件测试】基于项目驱动的功能测试报告
  • K8S cgroups详解
  • JS | 正则 · 常用正则表达式速查表
  • spring中的@Value注解详解
  • 【网络原理】数据链路层
  • 一文了解B+树的删除原理
  • SpringBoot 整合 Langchain4j 构建AI智能体应用
  • 英语时态--中英文对“时间”的不同理解
  • 在Python中计算函数耗时并超时自动退出
  • 总结C/C++中程序内存区域划分
  • C++.IP协议通信
  • 【数据结构】前言
  • DEEPPOLAR:通过深度学习发明非线性大核极坐标码(1)
  • 学习教育期间违规吃喝,李献林、叶金广等人被通报
  • 河南信阳拟发文严控预售许可条件:新出让土地开发的商品房一律现房销售
  • 山东省市监局“你点我检”专项抽检:一批次“无抗”鸡蛋农兽药残留超标
  • 马上评丨火车穿村而过多人被撞身亡,亡羊补牢慢不得
  • 香港根据《维护国家安全条例》订立附属法例
  • 为惩戒“工贼”,美国编剧工会“痛下杀手”