Spark DAG 概述 及 Submit Job

DAG 概述

DAG,有向无环图,Directed Acyclic Graph的缩写,常用于建模。Spark中使用DAG对RDD的关系进行建模,描述了RDD的依赖关系,这种关系也被称之为lineage,RDD的依赖关系使用Dependency维护,参考Spark RDD之Dependency,DAG在Spark中的对应的实现为DAGScheduler

介绍DAGScheduler中的一些概念,有助于理解后续流程。

名词 解释
Job 调用RDD的一个action,如count,即触发一个Job,spark中对应实现为ActiveJob,DAGScheduler中使用集合activeJobs和jobIdToActiveJob维护Job
Stage 代表一个Job的DAG,会在发生shuffle处被切分,切分后每一个部分即为一个Stage,Stage实现分为ShuffleMapStage和ResultStage,一个Job切分的结果是0个或多个ShuffleMapStage加一个ResultStage
Task 最终被发送到Executor执行的任务,和stage的ShuffleMapStage和ResultStage对应,其实现分为ShuffleMapTask和ResultTask

Submit Job

在介绍 Submit Job 前,需要先引入一个概念:EventLoop

EventLoop

DAGScheduler 使用 EventLoop(LinkedBlockingDeque)异步处理Job的流程,程序由同步改为异步是优化并发,提升性能的常见手段,在spark中使用的非常多。

异步处理借助于 EventLoop 实现,EventLoop内部维护了LinkedBlockingDeque,LinkedBlockingDeque是基于链表实现的双端阻塞队列,定义如下:

private[spark] abstract class EventLoop[E](name: String) extends Logging {

  private val eventQueue: BlockingQueue[E] = new LinkedBlockingDeque[E]()

  private val stopped = new AtomicBoolean(false)

  private val eventThread = new Thread(name) {
    override def run(): Unit = {
      while (!stopped.get) {
          val event = eventQueue.take()
          onReceive(event)
      }
    }
  }
  
  //抽象方法,需要在子类实现
  protected def onReceive(event: E): Unit
  
  ...  
}

DAGSchedulerEvent

DAGScheduler对事件进行了分类。
事件的父类为 DAGSchedulerEvent,也是EventLoop中存储的类型。

具体子类类型为:


上面的事件基本能够见名知义,下面 Submit Job 部分会涉及到第一个事件JobSubmitted。

DAGSchedulerEventProcessLoop

EventLoop的实现类,主要为抽象方法onReceive的实现,处理各种不同DAGSchedulerEvent。如下:
DAGSchedulerEventProcessLoop:

private[scheduler] class DAGSchedulerEventProcessLoop(dagScheduler: DAGScheduler)
  extends EventLoop[DAGSchedulerEvent]("dag-scheduler-event-loop") with Logging {

  override def onReceive(event: DAGSchedulerEvent): Unit = {
    doOnReceive(event)
  }
}

DAGSchedulerEventProcessLoop 继承自 EventLoop,并重写了 onReceive 方法,看下 doOnReceive:

  private def doOnReceive(event: DAGSchedulerEvent): Unit = event match {
    case JobSubmitted(jobId, rdd, func, partitions, callSite, listener, properties) =>
      dagScheduler.handleJobSubmitted(jobId, rdd, func, partitions, callSite, listener, properties)

    case MapStageSubmitted(jobId, dependency, callSite, listener, properties) =>
      dagScheduler.handleMapStageSubmitted(jobId, dependency, callSite, listener, properties)
    ...
  }

onReceive方法调用doOnReceive,doOnReceive中根据事件的类型,调用DAGScheduler的不同方法处理。如上面提到的JobSubmitted事件,交给DAGScheduler的handleJobSubmitted方法处理。

SubmitJob

Spark 任务调度之Driver send Task 我们介绍了SparkContextrunJob方法调用DAGSchedulerrunJob方法,把RDD交给DAGScheduler处理。

查看DAGScheduler 中 runJob方法中的部分代码:


submitJob 方法部分代码:

eventProcessLoop.post(JobSubmitted(
      jobId, rdd, func2, partitions.toArray, callSite, waiter,
      SerializationUtils.clone(properties)))

调用 DAGSchedulerEventProcessLoop 的 post方法,post是在父类 EventLoop 实现:

  def post(event: E): Unit = {
    eventQueue.put(event)
  }

把事件添加到队列 eventQueue,上面代码中提到,EventLoop 中创建了线程,并在线程中 只要while (!stopped.get),就会从队列中取event:val event = eventQueue.take(),并回调 onReceive(event),最终在 DAGSchedulerEventProcessLoop 中消费事件。

总结

介绍了EventLoop的概念及DAGScheduler使用EventLoop异步处理Job的流程,但是EventLoop中维护的LinkedBlockingDeque并没有指定容量,默认容量为Integer.MAX_VALUE,如果eventThread消费不及时,有OOM的风险,最后 DAGScheduler 消费 JobSubmitted 事件的流程大致如下

  1. ①-④流程,提交 JobSubmitted 事件到 LinkedBlockingDeque。
  2. (1)-(4)流程,eventThread循环消费 LinkedBlockingDeque,最终将JobSubmitted事件交给 DAGScheduler 的 handleJobSubmitted 方法处理。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容