一、spark中的提交模式:

1、Standalone-client模式:

(1)、Standalone-client提交任務:./spark-submit --master spark://node01:7077 --deploy-mode client --class org.apache.spark.examples.SparkPi ../lib/spark-examples-1.6.0-hadoop2.6.0.jar 100

(2)、執行流程:

1.client模式提交任務後,會在客戶端啟動Driver進程。

2.Driver會向Master申請啟動Application啟動的資源。

3.資源申請成功,Driver端將task發送到worker端執行。

4.worker將task執行結果返回到Driver端。

(3)、總結:client模式適用於測試調試程序。Driver進程是在客戶端啟動的,這裡的客戶端就是指提交應用程序的當前節點。在Driver端可以看到task執行的情況。生產環境下不能使用client模式,是因為:假設要提交100個application到集羣運行,Driver每次都會在client端啟動,那麼就會導致客戶端100次網卡流量暴增的問題。(因為要監控task的運行情況,會佔用很多埠,如上圖的結果圖)客戶端網卡通信,都被task監控信息佔用。

(4)、Client端作用 :Driver負責應用程序資源的申請、任務的分發、結果的回收、監控task執行情況。

2、Standalone-cluster模式:

(1)、Standalone-cluster提交任務:./spark-submit --master spark://node01:7077 --deploy-mode cluster --class org.apache.spark.examples.SparkPi ../lib/spark-examples-1.6.0-hadoop2.6.0.jar 100

(2)、執行流程:

1.cluster模式提交應用程序後,會向Master請求啟動Driver.(而不是啟動application) 。

2.Master接受請求,隨機在集羣一臺節點啟動Driver進程。

3.Driver啟動後為當前的應用程序申請資源。Master返回資源,並在對應的worker節點上發送消息啟動Worker中的executor進程。

4.Driver端發送task到worker節點上執行。

5.worker將執行情況和執行結果返回給Driver端。Driver監控task任務,並回收結果。

(3)、總結:1.當在客戶端提交多個application時,Driver會在Woker節點上隨機啟動,這種模式會將單節點的網卡流量激增問題分散到集羣中。在客戶端看不到task執行情況和結果。要去webui中看。

2.cluster模式適用於生產環境

3.Master模式先啟動Driver,再啟動Application。

3、整體架構圖:

4、spark運行流程:

1、構建Spark Application的運行環境,啟動SparkContext

2、SparkContext向資源管理器(可以是Standalone,Mesos,Yarn)申請運行Executor資源,並啟動StandaloneExecutorbackend。

3、Executor向SparkContext申請Task。

4、SparkContext將應用程序分發給Executor。

5、SparkContext構建成DAG圖,將DAG圖分解成Stage、將Taskset發送給Task Scheduler,最後由Task Scheduler將Task發送給Executor運行。

6、Task在Executor上運行,運行完釋放所有資源。

5、spark運行特點:

1、每個Application獲取專屬的executor進程,該進程在Application期間一直駐留,並以多線程方式運行Task。這種Application隔離機制是有優勢的,無論是從調度角度看(每個Driver調度他自己的任務),還是從運行角度看(來自不同Application的Task運行在不同JVM中),當然這樣意味著Spark Application不能跨應用程序共享數據,除非將數據寫入外部存儲系統。

2、Spark與資源管理器無關,只要能夠獲取executor進程,並能保持相互通信就可以了。

3、提交SparkContext的Client應該靠近Worker節點(運行Executor的節點),最好是在同一個Rack裏,因為Spark Application運行過程中SparkContext和Executor之間有大量的信息交換。

4、Task採用了數據本地性和推測執行的優化機制。

二、spark中常用術語及解釋:

1、Application:用戶編寫的spark的程序,其中包括一個Driver功能的代碼塊和分佈在集羣中多個節點上運行的Executor代碼。

2、Driver:運行上述的Application的main函數並創建SparkContext,目的是為了準備spark的運行環境,在spark中有SparkContext負責和ClusterManager通信,進行資源的申請、任務的分配和監控等,當Exectutor運行完畢的時候,負責把SparkContext關閉。

3、Executor:某個Application運行在Worker節點的一個進程,該進程負責某些Task,並且負責將數據存到內存或磁碟上,每個Application都有各自獨立的一批Executor,在Spark on yarn模式下,該進程被稱為CoarseGrainedExecutor Backend。一個CoarseGrainedExecutor Backend有且僅有一個Executor對象,負責將Task包裝成taskRuuner,並從線程池中抽取一個空閑線程運行Task,每一個CoarseGrainedExecutor Backend能夠運行的Task數量取決於cpu數量。

4、Cluster Manager:指的是在集羣上獲取資源的外部服務,目前有三種類型:

(1)、Sparkalone:spark的原生的資源管理,由Master負責資源的分配。

(2)、Apache Mesos:與Hadoop MR兼容性良好的一種資源調度框架。

(3)、Hadoop Yarn:只要指yarn中的ResourceManager。

5、Worker:集羣中可以運行Application代碼的節點,在sparkstandalone模式中是通過slave文件配置的worker節點,在Spark on yarn模式下就是NodeManager節點。

6、Task:被送到某個Executor上的工作單元,和HadoopMR中的MapTask、ReduceTask概念一樣,是運行Application的基本單位。多個Task組成一個Stage,而Task的調度和管理等是由TaskScheduler負責。

7、Job:包含多個Task組成的並行計算,往往由Spark Action觸發生成,一個Application中往往會產生多個Job。

8、Stage:每個job會被拆分成多組Task,作為一個TaskSet,也就是Stage,Stage的劃分和調度是由DAGScheduler來負責的,Stage有非最終的Stage(Shuffle Map Stage)和最終Stage(Result Stage)兩種,Stage的邊界就是發生Shuffle的地方。

9、DAGScheduler:根據Job構建DAG,並提交給Stage給TaskScheduler。其劃分Stage的依據是RDD之間的依賴的關係找出開銷最小的調度方法,如圖:

10、TaskScheduler:將TaskSet交給Worker運行,每個Executor運行什麼Task就在此時發生的,TashScheduler維護所有的TaskSet,當Executor向Driver發生心跳時,TaskScheduler會根據資源剩餘情況分配相應的Task,另外TaskScheduler還維護著所有的Task的運行標籤,重試失敗的Task,如圖:

11、在不同運行模式下任務調度器具體為:

(1)、Spark On Standalone模式為:TaskSchedule。

(2)、Yarn Client模式為:YarnClientClusterScheduler。

(3)、Yarn Cluster模式為:YarnClusterScheduler。

總結:

Job=多個stage,Stage=多個同種task, Task分為ShuffleMapTask和ResultTask,Dependency分為ShuffleDependency和NarrowDependency。

三、spark的運行模式:

1、Spark Standalone模式:

(1)、資源調度框架是使用spark自帶的。

(2)、採用Master/Slaves的典型架構,選中ZK來實現Master的HA。

(3)、架構圖:

(4)、該模式中主要的節點有Client、Master、Worker節點,其中Driver既可以運行在Master節點上,也可以運行在本地的Client端。當使用提交程序的時候,使用new SparkConf.setManager("spark://bigdata111:7077")方式運行spark任務的時候,Driver是運行在本地Client端上面的。(5)、運行過程:

spark運行的過程如下:

(1)、SparkContext連接到Master,向Master註冊並申請資源(CPU Core 和Memory)。

(2)、Master根據SparkContext的資源申請要求和Worker心跳週期內報告的信息決定在哪個Worker上分配資源,然後在該Worker上獲取資源,然後啟動StandaloneExecutorBackend。

(3)、StandaloneExecutorBackend向SparkContext註冊;

(4)、SparkContext將Applicaiton代碼發送給StandaloneExecutorBackend;並且SparkContext解析Applicaiton代碼,構建DAG圖,並提交給DAG Scheduler分解成Stage(當碰到Action操作時,就會催生Job;每個Job中含有1個或多個Stage,Stage一般在獲取外部數據和shuffle之前產生),然後以Stage(或者稱為TaskSet)提交給Task Scheduler,Task Scheduler負責將Task分配到相應的Worker,最後提交給StandaloneExecutorBackend執行;

(5)、StandaloneExecutorBackend會建立Executor線程池,開始執行Task,並向SparkContext報告,直至Task完成;

(6)、所有Task完成後,SparkContext向Master註銷,釋放資源。

(6)、啟動shell命令:

先啟動spark:./sbin/start-all.sh

啟動交互的shell命令:./bin/spark-shell.sh --master bigdata111:7077,還有跟隨的參數可以用./bin/spark-shell.sh --help來查找。spark-submit同理。

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

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

2、Spark on yarn模式一:yarn-client:

(1)、Yarn-Client模式中,Driver在客戶端本地運行,這種模式可以使得Spark Application和客戶端進行交互,因為Driver在客戶端,所以可以通過webUI訪問Driver的狀態,默認是hadoop1:4040訪問,而YARN通過http:// hadoop1:8088訪問。

(2)、運行具體流程:

(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;

(3)、流程圖:

3、Spark on yarn模式二:yarn-cluster:

(1)、在YARN-Cluster模式中,當用戶向YARN中提交一個應用程序後,YARN將分兩個階段運行該應用程序:第一個階段是把Spark的Driver作為一個ApplicationMaster在YARN集羣中先啟動;第二個階段是由ApplicationMaster創建應用程序,然後為它向ResourceManager申請資源,並啟動Executor來運行Task,同時監控它的整個運行過程,直到運行完成。

(2)、運行流程:

(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隨時掌握各個任務的運行狀態,從而可以在任務失敗時重新啟動任務;

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

(3)、流程圖:

四、spark-yarn中的兩種模式區別:

1、兩種模式:第一種是spark on client,第二種是spark on cluster。

2、Application Master:在YARN中,每個Application實例都有一個ApplicationMaster進程,它是Application啟動的第一個容器。它負責和ResourceManager打交道並請求資源,獲取資源之後告訴NodeManager為其啟動Container。

3、yarn-client:Application Master僅僅向YARN請求Executor,Client會和請求的Container通信來調度他們工作,也就是說Client不能離開。

4、yarn-cluster:Driver運行在AM(Application Master)中,它負責向YARN申請資源,並監督作業的運行狀況。當用戶提交了作業之後,就可以關掉Client,作業會繼續在YARN上運行,因而YARN-Cluster模式不適合運行交互類型的作業。

更多文章見:

讓我遇見你。?

www.shiruiblog.cn
圖標

推薦閱讀:
相關文章