您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關Spark2.x中SparkContext的原理是什么,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
TaskScheduler初始化、向SparkMaster節點進行Application、及Executor反向注冊等(核心);
DAGScheduler創建和初始化;
SparkUI界面的創建和初始化;
下面我就結合源碼詳細講解SparkContext的原理和加載過程,這里說明一下我們生產環境用的是Spark2.x,這里就拿Spark2.2.0的源碼進行講解,這里引用網上的一張SparkContext原理剖析圖:
一.TaskScheduler:
在源碼SparkContext.scala中首先調用函數createTaskScheduler()創建TaskScheduler;
在createTaskScheduler中會根據你的提交模式,分別進行對應模式下的代碼,不同的提交模式,會創建不同的TaskScheduler,這里我們以standalone模式進行講解:
函數createTaskScheduler先去創建一個TaskSchedulerImpl(它其實就是TaskScheduler),然后創建SparkDeploySchedulerBackend(它在底層會受TaskSchedulerImp的控制,實際上負責與Master的注冊,Executor的反注冊,Task發送到Executor等操作),然后調用TaskSchedulerImpl的initialize()方法,代碼如下:
最后一行代碼會根據不同的調度策略,調用函數buildPools去創建調度池。
TaskScheduler和DAGScheduler創建完成后,調用TaskScheduler的start()函數啟動,其實函數內部是調用了SchedulerBackend的start()函數,
start()函數中,先是從spark-submit命令行中獲取用戶提交的一些參數進行了初始化,比如driverUrl、extraJavaOpts、classPathEntries、libraryPathEntries等,通過這些參數創建ApplicationDescription實例,這個ApplicationDescription非常重要,它代表了當前用戶提交的application的一切情況,包括application最大需要多少CPU Core,每個slave上需要多少內存等信息。最后去創建一個APPClient實例,由于這里是Standalone模式所以這里創建一個StandaloneAppClient實例,它負責為application與Spark集群進行通信。它會接收一個Spark Master的URL,以及一個application,和一個集群事件的監聽器,以及各種事件發生時監聽器的回調函數,如下圖:
至此TaskScheduler啟動完成,調用waitForRegistration()函數等待注冊完成;
二、DAGScheduler的創建
DAGScheduler類實現了面向stage的調度機制的高層次的調度層,代碼位置:
DAGScheduler創建主要干了以下幾件事:
1).每個job計算一個stage的DAG(有向無環圖),stage是根據action進行劃分的;
2).追蹤RDD的stage輸出,是否寫入磁盤或者內存等存儲介質中;
3).尋找一個消耗(最優、最小)調度機制來運行job;
4).負責將stage封裝成Taskset提交到TaskSchdulerImpl,通過集群來運行一批task,這里注意:每一批task運行相同的代碼,只是處理不同部分的數據,這里才體現了分布式計算;
5).負責每個task運行的最佳位置,根據當前緩存狀態,將這些最佳位置提交給TaskSchdulerImpl;
6).處理由于shuffle導致文件輸出丟失導致的失敗,該stage會被重新提交;如果不是由于shuffle內部導致的失敗,例如OOM,會被TaskSchdulerImpl處理,多次重試每一個task,如果最后還是不行,取消stage運行,最后整個app掛掉。
三、SparkUI的創建
這里是SparkContext初始化的最后一步,調用SparkUI中的函數createLiveUI進行界面的創建,默認綁定了4040端口,能顯示Application的運行狀態,這里會啟動一個jetty服務器來顯示網頁,代碼位置:
這里注冊一個監聽SparkListenerBusts,即所有spark消息SparkListenerEvents 被異步的發送給它. ,這個類主要功能如下:
1).保存有消息隊列,負責消息的緩存
2).保存有注冊過的listener,負責消息的分發
補充下yarn常用的三種調度策略:
?1).FIFO Scheduler:
把應用按提交的順序排成一個隊列,這是一個先進先出隊列,在進行資源分配的時候,先給隊列中最頭上的應用進行分配資源,待最頭上的應用需求滿足后再給下一個分配,以此類推。
2).Fair Scheduler:
? 在Fair調度器中,我們不需要預先占用一定的系統資源,Fair調度器會為所有運行的job動態的調整系統資源。如下圖所示,當第一個大job提交時,只有這一個job在運行,此時它獲得了所有集群資源;當第二個小任務提交后,Fair調度器會分配一半資源給這個小任務,讓這兩個任務公平的共享集群資源。
3).Capacity Scheduler:
而對于Capacity調度器,有一個專門的隊列用來運行小任務,但是為小任務專門設置一個隊列會預先占用一定的集群資源,這就導致大任務的執行時間會落后于使用FIFO調度器時的時間。
以上就是Spark2.x中SparkContext的原理是什么,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。