Spark DAG之SubmitJob

文章目录

  • 概要
  • 1. EventLoop
  • 2. DAGSchedulerEvent
  • 3. DAGSchedulerEventProcessLoop
  • 4. SubmitJob
      • 4.1 SubmitJob之先调用runJob()
      • 4.2 SubmitJob之调用submitJob()
  • 总结

概要

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

1. EventLoop

异步处理借助于EventLoop实现,EventLoop内部维护了LinkedBlockingDeque,LinkedBlockingDeque是基于链表实现的双端阻塞队列,参考LinkedBlockingDeque.java,LinkedBlockingDeque支持双端同时操作,在指定容量并且容量已满时,支持阻塞。定义如下
Spark DAG之SubmitJob_第1张图片
如上图,除了定义eventQueue之外,还定义了线程eventThread,eventThread中循环消费eventQueue中存储的事件,消费方法为onReceive,是抽象方法,具体逻辑由子类实现。UML如下
Spark DAG之SubmitJob_第2张图片

2. DAGSchedulerEvent

Spark DAG之SubmitJob_第3张图片
DAGScheduler对事件进行了分类,父类为DAGSchedulerEvent,也是EventLoop中存储的类型,所有子类(case class)类型如下:

JobSubmitted MapStageSubmitted
StageCancelled JobCancelled
JobGroupCancelled AllJobsCancelled
BeginEvent GettingResultEvent
CompletionEvent ExecutorAdded
ExecutorLost TaskSetFailed
ResubmitFailedStages

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

3. DAGSchedulerEventProcessLoop

Spark DAG之SubmitJob_第4张图片

回顾EventLoop,线程eventThread,eventThread中循环消费eventQueue中存储的事件,消费方法为onReceive,是抽象方法,需要子类实现

作为EventLoop的实现类,就对抽象方法onReceive进行了实现,处理各种不同DAGSchedulerEvent。这个onReceive()如下
Spark DAG之SubmitJob_第5张图片
onReceive方法调用doOnReceive,doOnReceive中根据事件的类型,调用DAGScheduler的不同方法处理。如上面提到的JobSubmitted事件,交给DAGScheduler的handleJobSubmitted方法处理。查看doOnReceive方法:
Spark DAG之SubmitJob_第6张图片

4. SubmitJob

Spark 任务调度之Driver send Task我们介绍了SparkContext的runJob方法调用DAGScheduler的runJob方法,把RDD交给DAGScheduler处理。查看DAGScheduler的runJob方法

4.1 SubmitJob之先调用runJob()

查看runJob()函数说明:
Spark DAG之SubmitJob_第7张图片
查看内部:
Spark DAG之SubmitJob_第8张图片
结合定义和代码可以知道,795行,runJob方法内部会去调用submitJob()方法,异步提交job,并等待submitJob()创建并返回的JobWaiter;
查看submitJob():

4.2 SubmitJob之调用submitJob()

Spark DAG之SubmitJob_第9张图片
Spark DAG之SubmitJob_第10张图片
如上图注释处,submitJob先是对Partition做了一些check,然后使用DAGSchedulerEventProcessLoop提交JobSubmitted事件,最后DAGSchedulerEventProcessLoop中调用DAGScheduler的handleJobSubmitted方法处理。

总结

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

  1. ①-④流程,提交JobSubmitted事件到LinkedBlockingDeque。
  2. (1)-(4)流程,eventThread循环消费LinkedBlockingDeque,最终将JobSubmitted事件交给DAGScheduler的handleJobSubmitted方法处理。

你可能感兴趣的:(Saprk)