標籤:

Spark Core源碼分析--任務提交

看了一段時間的spark源碼資料,對於spark有了一定的了解,主要是理清思路。

本人能力有限,如果有說得不對的地方,請留言批評指正。

廢話不多說,直接進入正題。

我們在使用spark時,不管時spark Core、spark SQL還是spark streaming,通常會有一下三步:

(1)開始階段--提交任務

(2)任務執行中--任務提交

(3)任務結束,得到結果

1、任務提交

任務提交的方式有兩種:

一種是通過spark-shell的方式,

提交我們的命令,例如:spark-shell --master local[2],這樣就會啟動spark進入本地模式,並處於待命狀態。

另外一種方式是spark-submit的方式,

我們可以把代碼寫好,打包,通過spark-submit提交jar的形式運行spark。

總結:

上述兩種提交方式,其本質都是將觸發spark-class方法去執行spark任務,例如:

最終的任務提交順序是:

spark-shell --> spark-submit --> spark-class --> sparksubmit.main --> sparkloop --> createSparkContext

2、createSparkContext

SparkContext是進行spark開發的主要介面,是spark上層應用和底層實現的中轉站。

創建sparkContext時,會涉及到一下幾點內容:

(1)SparkEnv

(2)DAGScheduler

(3)TaskScheduler

(4)SchedulerBackend

(5)WebUI

創建SparkContext之前,需要對上述參數做好配置(即:創建sparkConf,並設置相關的參數),通過sparkConf來創建sparkEnv。

我們可以看看sparkEnv的參數設置:

executorId: // executor ID

actorSystem: //akka通信

serializer: // 序列化

closureSerializer //閉包管理

cacheManager: //用於存儲中間計算結果

mapOutputTracker: //用來緩存Mapstatus信息,並可以從MapOutputMaster

shufflerManager // 路由維護表

broadcastManager: //廣播

connectManager: //網路連接管理器

securityManager: // 安全管理

httpfileServer: //文件存儲伺服器

sparkfilesDir: // 文件存儲目錄

metricsSystem: // 測量

conf // 配置文件

在sparkConf中設置好參數,就可以創建sparkContext,創建完sparkContext就會使用createTaskScheduler()方法創建TaskScheduler,進而創建DAGschedulern

在創建TaskScheduler之前,需要創建HeartbeatReceiver,因為Executor需要它去創建DAGscheduler。

// We need to register "HeartbeatReceiver" before "createTaskScheduler" because Executor willn// retrieve "HeartbeatReceiver" in the constructor. (SPARK-6640)n

// Create and start the schedulernval (sched, ts) = SparkContext.createTaskScheduler(this, master)n_schedulerBackend = schedn_taskScheduler = tsn_dagScheduler = new DAGScheduler(this)n_heartbeatReceiver.ask[Boolean](TaskSchedulerIsSet)n

在代碼提交的最後階段是啟動webUI。


推薦閱讀:

矽谷之路 48: 深入淺出Spark(五)數據怎麼存
Spark從1.4.x升級到1.6的喜人效果
矽谷之路57:深入淺出Spark(八)如何處理實時數據
深入淺出Spark(三)什麼是Standalone

TAG:Spark |