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中存儲的類型,具體子類類型如下

JobSubmitted MapStageSubmitted
StageCancelled JobCancelled
JobGroupCancelled AllJobsCancelled
BeginEvent GettingResultEvent
CompletionEvent ExecutorAdded
ExecutorLost TaskSetFailed
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方法處理。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章