Spark任务切割提交源码领读

个人总结,以官网为准
如有错误,欢迎指出

在这里插入图片描述

概述

  • RDD的action算子触发SparkContext的runjob
  • 然后触发DAG的runjob方法
  • DAG执行提交job方法,并递归切割stage
  • DAG将任务提交给TaskSchedulerImpl
  • TaskSchedulerImpl与CoarseGrainedSchedulerBackend等协同将任务封装为TaskSetManger,并请求资源,
  • TaskSchedulerImpl封装任务为TaskDesc并序列化发送给Excutor

总结:

重要的几个类及其作用:

  • DAGScheduler
    • 按分区切割任务
    • 确定任务的优先位置
    • 使用MapOutputTracker上传ShuffleId及分区为shuffle拉取数据做准备
  • TaskSheduler
    • 包装DAG给出的Takset为TaskManager
    • 与调度池使用调度算法协调任务的调度
    • 将任务与资源绑定
  • CoarseGrainedSchedulerBackend
    • 与Excutor通讯启动任务

问题:

  • 贯穿整个流程中的数据

    • rdd
    • rdd func计算函数
    • partitions 分区
    • task locatiy 任务优先放在哪个excutor(host表达)
  • 怎么切割的stage

    • 从最后一个RDD 通过 RDD之前的依赖关系(shuffle依赖和窄依赖)结合stack数据结构,递归遍历出所有的stage.
      在这里插入图片描述
    • 重要的方法有如下几个:
    • getShuffleDependencies 获取RDD的依赖
    • getOrCreateShuffleMapStage 根据依赖获取ShuffleMapStage
    • getMissingAncestorShuffleDependencies 拿到当前Dependency之前所有的Dependency封装成ShuffleMapStag
      在这里插入图片描述
      在这里插入图片描述
  • 在哪里使用MapOutputTracker保存ShuffleId为后面shuffle拉取数据做准备
    在这里插入图片描述

  • 在哪里确定任务的执行的位置
    在这里插入图片描述

  • 怎么按分区切割Task并序列化广播出去
    在这里插入图片描述

在这里插入图片描述

  • 调度算法在哪里使用

    • 调度池的初始化
      在这里插入图片描述
    • 调度池封装TaskSet为TaskSetManager
      在这里插入图片描述
    • 调度算法的使用
      在这里插入图片描述
  • 怎么将用户任务逻辑与资源绑定
    在这里插入图片描述

收获

当一个功能频繁在代码流程中贯穿的使用,不要使用一个对象引用一直向下传递然后调用方法。学会使用总线获取,发送事件处理事件。
比如:DAG的循环接收器
在这里插入图片描述

SparkUI的事件处理器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值