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

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操作等手段显著提升性能。

http://www.xdnf.cn/news/5304.html

相关文章:

  • Java大师成长计划之第18天:Java Memory Model与Volatile关键字
  • 游戏引擎学习第273天:动画预览
  • BGP联盟
  • MNIST DDP 分布式数据并行
  • 「OC」源码学习—— 消息发送、动态方法解析和消息转发
  • Docker拉取ubuntu22.04镜像使用ROS2 humble及仿真工具可视化进行导航
  • 【大模型面试每日一题】Day 15:流水线并行的Bubble问题及其缓解方法
  • Apache Flink 与 Flink CDC:概念、联系、区别及版本演进解析
  • 花朵识别系统Python+深度学习+卷积神经网络算法+TensorFlow+人工智能
  • Newton GPU 机器人仿真器入门教程(零)— NVIDIA、DeepMind、Disney 联合推出
  • 【目标检测系列】YOLOV1解读
  • openjdk底层汇编指令调用(一)——汇编指令及指令编码基础
  • 通过 Azure DevOps 探索 Helm 和 Azure AKS
  • Spark 中RDD、Job,stage,task的关系
  • ActiveMQ 生产环境问题排查与调优指南(一)
  • 编程日志5.3
  • 智能语音助手的未来:从交互到融合
  • 实战项目3(04)
  • 画立方体软件开发笔记 js-pytorch xlsx 导出 excel pnpm安装
  • uni-app学习笔记(二)--vue页面代码的构成和新建页面
  • Pandas学习笔记(四)
  • 嵌入式硬件篇---UART
  • 外网访问内网海康威视监控视频的方案:WebRTC + Coturn 搭建
  • Python OpenCV性能优化与部署实战指南
  • python 实现文件批量重命名
  • “frame stacking”---帮助强化学习稳定提升和收敛技巧
  • Nipype 简单使用教程
  • 5 从众效应
  • Spring Boot 集成 Flink CDC 实现 MySQL 到 Kafka 实时同步
  • RabbitMQ--进阶篇