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