Spark DAG之SubmitJob

概要

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

EventLoop

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

如上图,除了定义eventQueue之外,还定义了线程eventThread,eventThread中循环消费eventQueue中存储的事件,消费方法为onReceive,是抽象方法,具体逻辑由子类实现。UML如下

DAGSchedulerEvent

DAGScheduler对事件进行了分类,父类为DAGSchedulerEvent,也是EventLoop中存储的类型,具体子类类型如下

JobSubmittedMapStageSubmitted
StageCancelledJobCancelled
JobGroupCancelledAllJobsCancelled
BeginEventGettingResultEvent
CompletionEventExecutorAdded
ExecutorLostTaskSetFailed
ResubmitFailedStages

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

DAGSchedulerEventProcessLoop

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

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

SubmitJob

Spark 任务调度之Driver send Task我们介绍了SparkContextrunJob方法调用DAGSchedulerrunJob方法,把RDD交给DAGScheduler处理。查看DAGScheduler的runJob方法
这里写图片描述
如上图注释处,调用submitJob方法异步提交Job,查看submitJob方法

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

总结

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值