个人总结,以官网为准
如有错误,欢迎指出
概述
- 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的事件处理器