plsql如何执行存储过程_如何理解Spark应用的执行过程
從Spark應(yīng)用的提交到執(zhí)行完成有很多步驟,為了便于理解,我們把應(yīng)用執(zhí)行的整個(gè)過程劃分為三個(gè)階段。而我們知道Spark有多種運(yùn)行模式,不同模式下這三個(gè)階段的執(zhí)行流程也不相同。
本文介紹這三個(gè)階段的劃分,并概要介紹不同模式下各個(gè)階段的執(zhí)行流程,各個(gè)模式的詳細(xì)流程會(huì)在后面的文章進(jìn)行分析。
應(yīng)用執(zhí)行的階段劃分
我們知道,Spark應(yīng)用可以在多種模式下運(yùn)行。所謂多種模式主要是針對(duì)資源分配方式來說的,Spark應(yīng)用可以在yarn,k8s,mesos等分布式資源管理平臺(tái)上運(yùn)行,也可以啟動(dòng)自帶的master和worker端來分配和管理資源(standalone模式)。例如:我們可以通過以下命令來向yarn提交一個(gè)spark任務(wù):
$SPARK_HOME/bin/spark-submit --class org.apache.spark.examples.SparkPi --master yarn --deploy-mode client $SPARK_HOME/examples/jars/spark-examples*.jar代碼1-3-1 spark應(yīng)用提交命令
要注意的是,在執(zhí)行以上應(yīng)用提交命令時(shí)yarn資源管理集群必須已經(jīng)啟動(dòng)。另外,Spark應(yīng)用的執(zhí)行是通過Driver端和Executor端共同配合完成的。
要完成以上應(yīng)用的執(zhí)行,需要經(jīng)歷很多步驟,為了便于更好的理解Spark應(yīng)用從提交到執(zhí)行完成的整個(gè)過程,我們把整個(gè)過程劃分成三個(gè)階段:
- 應(yīng)用的提交
- 執(zhí)行環(huán)境的準(zhǔn)備
- 任務(wù)的調(diào)度和執(zhí)行
如圖1所示:
圖1 應(yīng)用執(zhí)行總體流程不管以哪種模式運(yùn)行,Spark應(yīng)用的執(zhí)行過程都可以劃分成這三個(gè)階段。下面對(duì)這三個(gè)階段分別進(jìn)行說明。
三個(gè)階段概要說明
這三個(gè)階段以及每個(gè)階段要完成的目標(biāo)如圖2所示。
圖2 Spark應(yīng)用執(zhí)行的3階段目標(biāo)概述? 圖2 Spark應(yīng)用執(zhí)行的3階段目標(biāo)概述
我們根據(jù)以下代碼為例,來講解Spark應(yīng)用執(zhí)行的各個(gè)階段。
#第1階段:應(yīng)用的提交
這個(gè)階段在Driver端完成,主要目標(biāo)是:準(zhǔn)備依賴包并確定Spark應(yīng)用的執(zhí)行主類。具體的任務(wù)包括:
- 解析任務(wù)提交的參數(shù),并對(duì)參數(shù)進(jìn)行解析和保存。
- 準(zhǔn)備(可能會(huì)下載)任務(wù)啟動(dòng)參數(shù)指定的依賴文件或程序包。
- 根據(jù)Spark應(yīng)用的執(zhí)行模式和應(yīng)用的編寫語言,來確定執(zhí)行的主類名稱。
- 實(shí)例化執(zhí)行主類,生成SparkApplication對(duì)象,并調(diào)用SparkApplication#start()函數(shù)來運(yùn)行Spark應(yīng)用(若是Java或scala代碼其實(shí)是:執(zhí)行Spark應(yīng)用中的main函數(shù))。
注意:第1階段完成時(shí),Driver端并沒有向資源管理平臺(tái)申請(qǐng)任何資源,也沒有啟動(dòng)任何Spark內(nèi)部的服務(wù)。
第2階段:執(zhí)行環(huán)境的準(zhǔn)備
通過第1階段,已經(jīng)找到了運(yùn)行在Driver端的Spark應(yīng)用的執(zhí)行主類,并創(chuàng)建了SparkApplication對(duì)象:app。此時(shí),在app.start()函數(shù)中會(huì)直接調(diào)用主類的main函數(shù)開始執(zhí)行應(yīng)用,從而進(jìn)入第2階段。
第2階段主要目標(biāo)是:創(chuàng)建SparkSession(包括SparkContext和SparkEnv),完成資源的申請(qǐng)和Executor的創(chuàng)建。第2階段完成后Task的執(zhí)行環(huán)境就準(zhǔn)備好了。
也就是說,第2階段不僅會(huì)在Driver端進(jìn)行初始化,而且還要準(zhǔn)備好Executor。這一階段的任務(wù)主要是在Driver端執(zhí)行創(chuàng)建SparkSession的代碼來完成,也就是執(zhí)行下面一行代碼:
val第2階段的Driver端主要完成以下步驟:
- 創(chuàng)建SparkContext和SparkEnv對(duì)象,在創(chuàng)建這兩個(gè)對(duì)象時(shí),向Cluster Manager申請(qǐng)資源,啟動(dòng)各個(gè)服務(wù)模塊,并對(duì)服務(wù)模塊進(jìn)行初始化。
- 這些服務(wù)模塊包括:DAG調(diào)度服務(wù),任務(wù)調(diào)度服務(wù),shuffle服務(wù),文件傳輸服務(wù),數(shù)據(jù)塊管理服務(wù),內(nèi)存管理服務(wù)等。
第2階段的Executor端主要完成以下步驟:
- Driver端向Cluster Manager申請(qǐng)資源,若是Yarn模式會(huì)在NodeManager上創(chuàng)建ApplicationMaster,并由ApplicationMaster向Cluster Manager來申請(qǐng)資源,并啟動(dòng)Container,在Container中啟動(dòng)Executor。
- 在啟動(dòng)Executor時(shí)向Driver端注冊(cè)BlockManager服務(wù),并創(chuàng)建心跳服務(wù)RPC環(huán)境,通過該RPC環(huán)境向Driver匯報(bào)Executor的狀態(tài)信息。
詳細(xì)的執(zhí)行步驟,會(huì)在后面介紹每種模式的運(yùn)行原理時(shí),詳細(xì)分析。第2階段執(zhí)行完成后的Spark集群狀態(tài)如下:
執(zhí)行環(huán)境準(zhǔn)備完成后Spark集群的狀態(tài)第3階段:任務(wù)的調(diào)度和執(zhí)行
通過第2階段已經(jīng)完成了Task執(zhí)行環(huán)境的初始化,此時(shí),在Driver端已經(jīng)完成了SparkContext和SparkEnv的創(chuàng)建,資源已經(jīng)申請(qǐng)到了,并且已經(jīng)啟動(dòng)了Executor。
這一階段會(huì)執(zhí)行接下來的數(shù)據(jù)處理的代碼:
val第3階段Driver端主要完成以下步驟:
- 執(zhí)行Spark的處理代碼,當(dāng)執(zhí)行map操作時(shí),生成新的RDD;
- 當(dāng)執(zhí)行Action操作時(shí),觸發(fā)Job的提交,此時(shí)會(huì)執(zhí)行以下步驟:
- 根據(jù)RDD的血緣,把Job劃分成相互依賴的Stage;
- 把每個(gè)Stage拆分成一個(gè)或多個(gè)Task;
- 把這些Task提交給已經(jīng)創(chuàng)建好的Executor去執(zhí)行;
- 獲取Executor的執(zhí)行狀態(tài)信息,直到Executor完成所有Task的執(zhí)行;
- 獲取執(zhí)行結(jié)果和最終的執(zhí)行狀態(tài)。
小結(jié)
本節(jié)介紹了Spark應(yīng)用的執(zhí)行過程,通過本節(jié)的學(xué)習(xí)應(yīng)該對(duì)Spark應(yīng)用的執(zhí)行過程有一個(gè)總體的理解。接下來會(huì)根據(jù)具體的運(yùn)行模式來詳細(xì)分析每個(gè)階段的執(zhí)行步驟。
總結(jié)
以上是生活随笔為你收集整理的plsql如何执行存储过程_如何理解Spark应用的执行过程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Latex安装教程(附美赛论文latex
- 下一篇: java 面试题 由浅入深_面试官由浅入