Spark有3種運行模式,包括Standalone,YARN和Mesos,其中,Mesos和YARN模式類似。目前用得比較多的是Standalone模式和YARN模式
-
Standalone運行模式
Standalone模式是Spark實現的資源調度框架,其主要的節點有Client節點、Master節點和Worker節點。Driver既可以運行在Master節點上,也可以運行在本地Client端。當用spark-shell交互式工具提交spark的Job時,Driver在Master節點上運行。當使用spark-submit工具提交Job或者在Eclipse、IDEA等開發平臺上使用“new SparkConf().setMaster(spark://master:7077)"方式運行Spark任務時,Driver是運行在本地Client端上的。
當用spark-shell交互式工具提交Spark的Job時,使用spark-shell啓動腳本。該腳本啓動一個交互式的Scala命令界面,可供用戶來運行Spark相關命令。在Spark的安裝目錄下啓動spark-shell,啓動命令如下所示:
在spark-shell的啓動過程中可以看到如下的信息,從中可以看到Spark的版本爲2.1.0,spark內嵌的Scala版本爲2.11.8,Java的版本爲1.8.同時spark-shell在啓動的過程中會初始化SparkContext爲sc,以及初始化SQLContext爲sqlContext。界面出現”scala>"這樣的提示符,說明Spark交互式命令窗口啓動成功,如圖所示。用戶可在該窗口下編寫Spark相關代碼,
spark-shell啓動的時候也可以手動指定每個節點的內存和Executor使用的cpu個數,啓動命令如下所示:
當以Standalone模式向spark集羣提交作業時,作業的運行流程如下圖所示:
(1)首先,SparkContext連接到Master,向Master註冊並申請資源。
(2)Worker定期發送心跳信息給Master並報告Executor狀態。
(3)Master根據SparkContext的資源申請要求和Worker心跳週期內報告的信息決定在哪個Worker上分配資源,然後在該Worker上獲取資源,啓動StandaloneExecutorBackend。
(4)StandaloneExecutorBackend向SparkContext註冊。
(5)SparkContext將Application代碼發送給StandaloneExecutorBackend,並且SparkContext解析Application代碼,構建DAG圖,並提交DAG Scheduler,分解成Stage(當碰到Action操作時),就會催生Job,每個Job中含有一個或多個Stage),然後分配到相應的Worker,最後提交給StandaloneExecutorBackend執行。
(6)StandaloneExecutorBackend會建立Executor線程池,開始執行Task,並向SparkContext報告,直至Task完成。
(7)所有Task完成後,SparkContext向Master註銷,釋放資源。
-
YARN模式
YARN模式根據Driver在集羣中的位置分爲兩種,一種是YARN-Client模式(客戶端模式),另一種是YARN-Cluster模式(集羣模式)。
在YARN模式中,不需要啓動Spark獨立集羣,所以這個時候去訪問http://master:8080是訪問不了的。啓動YARN客戶端模式的Spark Shell命令如下所示:
在集羣模式下,Driver運行在Application Master上,Application Master進程同時負責驅動Application和從YARN中申請資源。該進程運行在YARN Container內,所以啓動Application Master的Client可以立即關閉,而不必持續到Application的聲明週期。
作業流程如下所示:
(1)客戶端生成作業信息提交給ResourceManager。
(2)ResourceManager在某一個NodeManager(由YARN決定)啓動Container,並將Application Master 分配給該NodeManager。
(3)NodeManager接收到ResourceManager的分配,啓動Application Master並初始化作業,此時NodeManager就稱爲Driver。
(4)Application向ResourceManager申請資源,ResourceManager分配資源的同時通知其他NodeManager啓動相應的Executor。
(5)Executor向NodeManager上的Application Master註冊彙報並完成相應的任務。
如下圖是YARN客戶端模式的作業運行流程。Application Master僅僅從YARN中申請資源給Executpr。之後Client會與Container通信進行作業調度
YARN模式的作業運行調度描述如下
(1)客戶端生成作業信息提交給ResourceManager
(2)ResourceManager在本地NodeManager啓動Container,並將Application Master分配給該NodeManager。
(3)NodeManager接收到ResourceManager的分配,啓動Application Master並初始化作業,此時這個NodeManager就稱爲Driver。
(4)Application向ResourceManager申請資源,ResouceManager分配資源同時通知其他NodeManager啓動相應的Executor。
(5)Executor向本地啓動的Application Master註冊彙報並完成相應的任務。
YARN-Cluster和YARN-Client區別
在YARN-Cluster模式下,SparkDriver運行在Application Master(AM)中,它負責向YARN申請資源,並監督作業的運行狀況。當用戶提交了作業之後,就可以關掉Client,作業會繼續在YARN上運行,所以YARN-Cluster模式不適合運行交互類型的作業。然而在YARN-Client模式下,AM僅僅向YARN請求Executor,Client會與請求得到的Container通信來調度它們的工作,也就是是Client不能離開。
總結來說,集羣模式的Spark Driver運行在AM中,而客戶端模式的Spark Driver運行在客戶端。所以,YARN-Cluster適用於生產,而YARN-Client適用於交互和調試,也就是希望快速地看到應用的輸出信息。