spark-submit幾種提交模式的區別

 spark的提交模式中,有三種提交方式:分別是基於spark集羣的standalone模式,基於YARN集羣的yarn-client和yarn-cluster三種模式,

Standalone,模式提交:

spark-submit --master spark://node01:7077 --class scala.WordCount_Online  --executor-memory 1g --total-executor-cores 4 /export/servers/original-wordCount-1.0-SNAPSHOT.jar  /spark/words.txt   /spark/out_spark
 

yarn-cluster模式提交

spark-submit --class org.apache.spark.examples.SparkPi \

--master yarn \

--deploy-mode cluster \

--driver-memory 1g \

--executor-memory 1g \

--executor-cores 1 \

/export/servers/spark/examples/jars/spark-examples_2.11-2.0.2.jar \

10

       yarn-client模式提交

spark-submit --class org.apache.spark.examples.SparkPi \

--master yarn \

--deploy-mode client \

--driver-memory 1g \

--executor-memory 512m \

--executor-cores 1 \

/export/servers/spark/examples/jars/spark-examples_2.11-2.0.2.jar \

10

spark-shell必須使用client模式

spark-shell --master yarn --deploy-mode client

  1. 原理

cluster模式:

 

Spark Driver首先作爲一個ApplicationMaster在YARN集羣中啓動,客戶端提交給ResourceManager的每一個job都會在集羣的NodeManager節點上分配一個唯一的ApplicationMaster,由該ApplicationMaster管理全生命週期的應用。具體過程:

 

1. 由client向ResourceManager提交請求,並上傳jar到HDFS上

這期間包括四個步驟:

a).連接到RM

b).從RM的ASM(ApplicationsManager )中獲得metric、queue和resource等信息。

c). upload app jar and spark-assembly jar

d).設置運行環境和container上下文(launch-container.sh等腳本)

 

2. ResourceManager爲該應用程序分配第一個Container,創建Spark ApplicationMaster(每個SparkContext都有一個ApplicationMaster)

3. NodeManager啓動ApplicationMaster,並向ResourceManager註冊

4. ApplicationMaster從HDFS中找到jar文件,啓動SparkContext、DAGscheduler和YARN Cluster Scheduler

5. ApplicationMaster向ResourceManager註冊申請container資源

6. ResourceManager通知NodeManager分配Container(每個container對應一個executor)

7. Spark ApplicationMaster直接和container(executor)進行交互,完成這個分佈式任務。

 

client模式:

 

在client模式下,Driver運行在Client上,通過ApplicationMaster向RM獲取資源。本地Driver負責與所有的executor container進行交互,並將最後的結果彙總。結束掉終端,相當於kill掉這個spark應用。一般來說,如果運行的結果僅僅返回到terminal上時需要配置這個。

客戶端的Driver將應用提交給Yarn後,Yarn會先後啓動ApplicationMaster和executor,另外ApplicationMaster和executor都是裝載在container裏運行,container默認的內存是1G,ApplicationMaster分配的內存是driver- memory,executor分配的內存是executor-memory。同時,因爲Driver在客戶端,所以程序的運行結果可以在客戶端顯示,Driver以進程名爲SparkSubmit的形式存在。

 

三種模式的執行流程:

Standalone模式運行過程:

1、我們提交一個任務,任務就叫Application

2、初始化程序的入口SparkContext,

2.1 初始化DAG Scheduler

2.2 初始化Task Scheduler

3、Task Scheduler向master去進行註冊並申請資源(CPU Core和Memory)

4、Master根據SparkContext的資源申請要求和Worker心跳週期內報告的信息決定在哪個Worker上分配資源,然後在該Worker上獲取資源,然後啓動StandaloneExecutorBackend;順便初始化好了一個線程池

5、StandaloneExecutorBackend向Driver(SparkContext)註冊,這樣Driver就知道哪些Executor爲他進行服務了。 到這個時候其實我們的初始化過程基本完成了,我們開始執行transformation的代碼,但是代碼並不會真正的運行,直到我們遇到一個action操作。生產一個job任務,進行stage的劃分

6、SparkContext將Applicaiton代碼發送給StandaloneExecutorBackend;並且SparkContext解析Applicaiton代碼,構建DAG圖,並提交給DAG Scheduler分解成Stage(當碰到Action操作        時,就會催生Job;每個Job中含有1個或多個Stage,Stage一般在獲取外部數據和shuffle之前產生)。

7、將Stage(或者稱爲TaskSet)提交給Task Scheduler。Task Scheduler負責將Task分配到相應的Worker,最後提交給StandaloneExecutorBackend執行;

8、對task進行序列化,並根據task的分配算法,分配task

9、對接收過來的task進行反序列化,把task封裝成一個線程

10、開始執行Task,並向SparkContext報告,直至Task完成。

11、資源註銷

 

Yarn-client模式運行過程:

1.Spark Yarn Client向YARN的ResourceManager申請啓動Application Master。同時在SparkContent初始化中將創建DAGScheduler和TASKScheduler等,由於我們選擇的是Yarn-Client模式,程序會選擇YarnClientClusterScheduler和YarnClientSchedulerBackend;

 

2.ResourceManager收到請求後,在集羣中選擇一個NodeManager,爲該應用程序分配第一個Container,要求它在這個Container中啓動應用程序的ApplicationMaster,與YARN-Cluster區別的是在該ApplicationMaster不運行SparkContext,只與SparkContext進行聯繫進行資源的分派;

 

3.Client中的SparkContext初始化完畢後,與ApplicationMaster建立通訊,向ResourceManager註冊,根據任務信息向ResourceManager申請資源(Container);

 

4.一旦ApplicationMaster申請到資源(也就是Container)後,便與對應的NodeManager通信,要求它在獲得的Container中啓動啓動CoarseGrainedExecutorBackend,CoarseGrainedExecutorBackend啓動後會向Client中的SparkContext註冊並申請Task;

 

5.Client中的SparkContext分配Task給CoarseGrainedExecutorBackend執行,CoarseGrainedExecutorBackend運行Task並向Driver彙報運行的狀態和進度,以讓Client隨時掌握各個任務的運行狀態,從而可以在任務失敗時重新啓動任務;

 

應用程序運行完成後,Client的SparkContext向ResourceManager申請註銷並關閉自己。

 

Yarn-cluster模式運行過程:

1.   Spark Yarn Client向YARN中提交應用程序,包括ApplicationMaster程序、啓動ApplicationMaster的命令、需要在Executor中運行的程序等;

 

2.   ResourceManager收到請求後,在集羣中選擇一個NodeManager,爲該應用程序分配第一個Container,要求它在這個Container中啓動應用程序的ApplicationMaster,其中ApplicationMaster進行SparkContext等的初始化;

 

3.   ApplicationMaster向ResourceManager註冊,這樣用戶可以直接通過ResourceManage查看應用程序的運行狀態,然後它將採用輪詢的方式通過RPC協議爲各個任務申請資源,並監控它們的運行狀態直到運行結束;

 

4.   一旦ApplicationMaster申請到資源(也就是Container)後,便與對應的NodeManager通信,要求它在獲得的Container中啓動啓動CoarseGrainedExecutorBackend,CoarseGrainedExecutorBackend啓動後會向ApplicationMaster中的SparkContext註冊並申請Task。這一點和Standalone模式一樣,只不過SparkContext在Spark Application中初始化時,使用CoarseGrainedSchedulerBackend配合YarnClusterScheduler進行任務的調度,其中YarnClusterScheduler只是對TaskSchedulerImpl的一個簡單包裝,增加了對Executor的等待邏輯等;

 

5.   ApplicationMaster中的SparkContext分配Task給CoarseGrainedExecutorBackend執行,CoarseGrainedExecutorBackend運行Task並向ApplicationMaster彙報運行的狀態和進度,以讓ApplicationMaster隨時掌握各個任務的運行狀態,從而可以在任務失敗時重新啓動任務;

 

應用程序運行完成後,ApplicationMaster向ResourceManager申請註銷並關閉自己。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章