通常而言,DriverApplication 的執(zhí)行與輸出都是通過SparkContext完成的,在正式提交Application 之前,首先需要初始化SparkContext。SparkContext隱藏了網(wǎng)絡(luò)通信、分布式部署、消息通信、存儲能力、計算能力、緩存、測量系統(tǒng)、文件服務(wù)、web服務(wù)等內(nèi)容。應(yīng)用程序的開發(fā)者只需要使用SparkContext 提供的API完成功能開發(fā)。
一個application ---> 一個或者多個job----->一個或者多個stage----->多個task
SparkContext 內(nèi)置的DAGScheduler負(fù)責(zé)去創(chuàng)建Job,將一個application轉(zhuǎn)化成為多個Job。(相應(yīng)的Job的劃分,是看應(yīng)用程序中,執(zhí)行了多少個action算子)
SparkContext 內(nèi)置的TaskScheduler :負(fù)責(zé)進(jìn)行任務(wù)的派發(fā),發(fā)送到相應(yīng)的節(jié)點,執(zhí)行task。
Spark優(yōu)先考慮使用節(jié)點的內(nèi)存作為存儲,當(dāng)內(nèi)存不足時槽考慮使用磁盤,這極大的減少了磁盤I/O,提升了執(zhí)行的效率,使得Spark適用于實時計算、流式計算等場景。此外,Spark還提供了以內(nèi)存為中心的高容錯的分布式文件系統(tǒng)Tachyon,供用戶選擇。
計算引擎由 SparkContext 中的 DAGScheduler、RDD 以及具體節(jié)點上的 Executor 負(fù)責(zé)執(zhí)行的 Map 和 Reduce 任務(wù)組成。DAGScheduler 和 RDD 雖然位于 SparkContext 內(nèi)部,但是在任務(wù)正式提交與執(zhí)行之前將Job 中的 RDD 組織成有向無環(huán)圖(簡稱 DAG)、并對 Stage 進(jìn) 行劃分決定了任務(wù)執(zhí)行階段任務(wù)的數(shù)量、迭代計算、shuffle 等過程。
單節(jié)點不足以提供足夠的存儲計算能力,所以作為大數(shù)據(jù)處理的Spark在SparkContext的TaskScheduler 組件中提供了,Standalone部署模式的實現(xiàn)和YANR、Mesos等分布式資源管理系統(tǒng)的支持。除了可用于實際生產(chǎn)環(huán)境 的 Standalone、YARN、Mesos、kubernetes、Cloud 等部署模式外,Spark 還提供了 Local 模式和 local-cluster 模式便于開發(fā)和調(diào)試。
Standalone、YARN、Mesos、kubernetes、Cloud:用于分布式生產(chǎn)場景。
Local用于本地測試。
Cluster Manager:spark集群的管理者,主要負(fù)責(zé)資源你的分配與管理。集群管理分配的資源屬于一級分配,它將各個worker上的內(nèi)存、CPU,等資源分配給應(yīng)用程序,但是并不對executor的資源分配。目前:Standalone、YARN、Mesos、K8S,EC2 等都可以作為 Spark 的集群管理器。
Master:spark集群的主節(jié)點。
Worker:Spark集群的工作節(jié)點,對spark應(yīng)用程序來說,由集群管理器分配得到資源的worker主要負(fù)責(zé)以下工作:創(chuàng)建 Executor,將資源和任務(wù)進(jìn)一步分配給 Executor,同步資源信息給 Cluster Manager。
Executor:執(zhí)行計算任務(wù)的進(jìn)程。主要負(fù)責(zé)執(zhí)行任務(wù),以及與 Worker、Driver Application 的信息同步。(主要是初始化一個線程池,調(diào)度其中的線程執(zhí)行相應(yīng)的計算任務(wù))
Driver Appication:客戶端驅(qū)動程序,也可以理解為客戶端的應(yīng)用程序,用于將任務(wù)程序轉(zhuǎn)化為RDD和DAG,并與Cluster Manager 進(jìn)行通信與調(diào)度,其中SparkContext這個對象的創(chuàng)建就是在Driver Appication中。
Deploy mode:部署的模式,在寫好的代碼,提交到集群中運行時:--master 指定資源的管理器。
其中常見的有yarn,在使用yarn的方式進(jìn)行任務(wù)提交的時候,通常必須配置另一個參數(shù):--deploy-mode client/cluster 有client和cluster兩種。
client,表示就把Driver程序,放在提交的節(jié)點。
cluster表示把Driver程序,放在集群中的任意節(jié)點。Driver程序決定了SparkContext對象在哪里創(chuàng)建。
各個角色之間的關(guān)系:
Spark 計算平臺有兩個重要角色,Driver 和 executor,不論是 StandAlone 模式還是 YARN 模式, 都是 Driver 充當(dāng) Application 的 master 角色,負(fù)責(zé)任務(wù)執(zhí)行計劃生成和任務(wù)分發(fā)及調(diào)度; executor 充當(dāng) worker 角色,負(fù)責(zé)實際執(zhí)行任務(wù)的 task,計算的結(jié)果返回 Driver。
- 用戶使用SparkContext 提供的 API(常用的有 textFile、sequenceFile、runJob、stop 等) 編寫Driver Application程序。
- 使用sparkContext對象提交的用戶應(yīng)用程序,首先會使用 BlockManager 和 BroadcastManager 將任務(wù)的資源配置進(jìn)行廣播。然后由 DAGScheduler 將任務(wù)轉(zhuǎn)換為 RDD 并組織成 DAG, DAG 還將被劃分為不同的 Stage。最后由 TaskScheduler 借助 ActorSystem 將任務(wù)提交給集群管理器(ClusterManager)。
- 集群管理器(ClusterManager)給任務(wù)分配資源,即將具體任務(wù)分配到 Worker 上,Worker 創(chuàng)建 Executor 來處理任務(wù)的運行。Standalone、YARN、Mesos、kubernetes、EC2 等都可以作 為 Spark 的集群管理器。
RDD 可以看做是對各種數(shù)據(jù)計算模型的統(tǒng)一抽象,Spark 的計算過程主要是 RDD 的迭代計算 過程,如上圖。RDD 的迭代計算過程非常類似于管道。分區(qū)數(shù)量取決于 partition 數(shù)量的設(shè)定,每個分區(qū)的數(shù)據(jù)只會在一個 Task 中計算。所有分區(qū)可以在多個機器節(jié)點的 Executor 上 并行執(zhí)行。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。