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
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監控信息佔用。
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任務,並回收結果。
2.cluster模式適用於生產環境
3.Master模式先啟動Driver,再啟動Application。
4、spark運行流程:
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採用了數據本地性和推測執行的優化機制。
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之間的依賴的關係找出開銷最小的調度方法,如圖:
11、在不同運行模式下任務調度器具體為:
(1)、Spark On Standalone模式為:TaskSchedule。
(2)、Yarn Client模式為:YarnClientClusterScheduler。
(3)、Yarn Cluster模式為:YarnClusterScheduler。
總結:
Job=多個stage,Stage=多個同種task, Task分為ShuffleMapTask和ResultTask,Dependency分為ShuffleDependency和NarrowDependency。
1、Spark Standalone模式:
(1)、資源調度框架是使用spark自帶的。
(2)、採用Master/Slaves的典型架構,選中ZK來實現Master的HA。
(3)、架構圖:
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 spark://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的狀態,默認是http://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申請註銷並關閉自己。
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模式不適合運行交互類型的作業。
更多文章見: