更新時間:2022-09-26 來源:黑馬程序員 瀏覽量:
將程序切換到【Executors】Tab頁面時,我們可以看到Spark Application運行到集群上時,由兩部分組成:Driver Program和Executors。
從圖中可以看到Spark Application運行到集群上時,由兩部分組成:Driver Program和Executors。
第一、Driver Program
相當于AppMaster,整個應用管理者,負責應用中所有Job的調(diào)度執(zhí)行;
運行JVM Process,運行程序的MAIN函數(shù),必須創(chuàng)建SparkContext上下文對象;
一個SparkApplication僅有一個;
第二、Executors
相當于一個線程池,運行JVM Process,其中有很多線程,每個線程運行一個Task任務,一個Task任務運行需要1 Core CPU,所有可以認為Executor中線程數(shù)就等于CPU Core核數(shù);
一個Spark Application可以有多個,可以設置個數(shù)和資源信息;
用戶程序從最開始的提交到最終的計算執(zhí)行,需要經(jīng)歷以下幾個階段:
1)、用戶程序創(chuàng)建 SparkContext 時,新創(chuàng)建的 SparkContext 實例會連接到 ClusterManager。 Cluster Manager 會根據(jù)用戶提交時設置的 CPU 和內(nèi)存等信息為本次提交分配計算資源,啟動 Executor。
2)、Driver會將用戶程序劃分為不同的執(zhí)行階段Stage,每個執(zhí)行階段Stage由一組完全相同Task組成,這些Task分別作用于待處理數(shù)據(jù)的不同分區(qū)。在階段劃分完成和Task創(chuàng)建后, Driver會向Executor發(fā)送 Task;
3)、Executor在接收到Task后,會下載Task的運行時依賴,在準備好Task的執(zhí)行環(huán)境后,會開始執(zhí)行Task,并且將Task的運行狀態(tài)匯報給Driver;
4)、Driver會根據(jù)收到的Task的運行狀態(tài)來處理不同的狀態(tài)更新。 Task分為兩種:一種是Shuffle Map Task,它實現(xiàn)數(shù)據(jù)的重新
洗牌,洗牌的結(jié)果保存到Executor 所在節(jié)點的文件系統(tǒng)中;另外一種是Result Task,它負責生成結(jié)果數(shù)據(jù);
5)、Driver 會不斷地調(diào)用Task,將Task發(fā)送到Executor執(zhí)行,在所有的Task 都正確執(zhí)行或者超過執(zhí)行次數(shù)的限制仍然沒有執(zhí)行成功時停止;
4040、8080、18080的區(qū)別
4040: 是一個運行的Application在運行的過程中臨時綁定的端口,用以查看當前任務的狀態(tài).4040被占用會順延到4041.4042等。
4040是一個臨時端口,當前程序運行完成后, 4040就會被注銷哦。
8080: 默認是StandAlone下, Master角色(進程)的WEB端口,用以查看當前Master(集群)的狀態(tài)。
18080: 默認是歷史服務器的端口, 由于每個程序運行完成后,4040端口就被注銷了. 在以后想回看某個程序的運行狀態(tài)就可以通過歷史服務器查看,歷史服務器長期穩(wěn)定運行,可供隨時查看被記錄的程序的運行過程。
運行起來一個Spark Application, 然后打開其4040端口,并查看:/export/server/spark/bin/spark-shell --master spark://node1.itcast.cn:7077。在node1運行pyspark-shell,WEB UI監(jiān)控頁面地址:http://node1:4040。
可以發(fā)現(xiàn)在一個Spark Application中,包含多個Job,每個Job有多個Stage組成,每個Job執(zhí)行按照DAG圖進行的。
其中每個Stage中包含多個Task任務,每個Task以線程Thread方式執(zhí)行,需要1Core CPU。
Spark Application程序運行時三個核心概念:Job、Stage、 Task,說明如下:
Job:由多個 Task 的并行計算部分,一般 Spark 中的 action 操作(如 save、collect,后面進一步說明),會 生成一個 Job。
Stage:Job 的組成單位,一個 Job 會切分成多個 Stage ,Stage 彼此之間相互依賴順序執(zhí)行,而每個 Stage 是多 個 Task 的集合,類似 map 和 reduce stage。
Task:被分配到各個 Executor 的單位工作內(nèi)容,它是 Spark 中的最小執(zhí)行單位,一般來說有多少個 Paritition (物理層面的概念,即分支可以理解為將數(shù)據(jù)劃分成不同 部分并行處理),就會有多少個 Task,每個 Task 只會處 理單一分支上的數(shù)據(jù)。