您的当前位置:首页正文

Spark DAG之SubmitJob

2024-11-25 来源:个人技术集锦

概要

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

1. EventLoop

异步处理借助于EventLoop实现,EventLoop内部维护了LinkedBlockingDeque,LinkedBlockingDeque是基于链表实现的双端阻塞队列,参考,LinkedBlockingDeque支持双端同时操作,在指定容量并且容量已满时,支持阻塞。定义如下

2. DAGSchedulerEvent

JobSubmittedMapStageSubmitted
StageCancelledJobCancelled
JobGroupCancelledAllJobsCancelled
BeginEventGettingResultEvent
CompletionEventExecutorAdded
ExecutorLostTaskSetFailed
ResubmitFailedStages

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

3. DAGSchedulerEventProcessLoop

作为EventLoop的实现类,就对抽象方法onReceive进行了实现,处理各种不同DAGSchedulerEvent。这个onReceive()如下

4. SubmitJob

我们介绍了SparkContext的runJob方法调用DAGScheduler的runJob方法,把RDD交给DAGScheduler处理。查看DAGScheduler的runJob方法

4.1 SubmitJob之先调用runJob()

查看runJob()函数说明:

4.2 SubmitJob之调用submitJob()



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

总结

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

显示全文