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

spark 大批量小文件写入多个文件夹_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并序列化广播出去

spark 大批量小文件写入多个文件夹_调度算法_02

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

收获

当一个功能频繁在代码流程中贯穿的使用,不要使用一个对象引用一直向下传递然后调用方法。学会使用总线获取,发送事件处理事件。

比如:DAG的循环接收器

spark 大批量小文件写入多个文件夹_spark_03

SparkUI的事件处理器