在使用spark-submit提交Spark任務一般有以下參數:
./bin/spark-submit \
--class <main-class> \
--master <master-url> \
--deploy-mode <deploy-mode> \
--conf <key>=<value> \
... # other options
<application-jar> \
[application-arguments]
其中deploy-mode是針對集羣而言的,是指集羣部署的模式,根據Driver主進程放在哪分爲兩種方式:client和cluster,默認是client,下面我們就詳細研究一下這兩種模式的區別
1. client mode
首先明白幾個基本概念:Master節點就是你用來提交任務,即執行bin/spark-submit命令所在的那個節點;Driver進程就是開始執行你Spark程序的那個Main函數,雖然我這裏邊畫的Driver進程在Master節點上,但注意Driver進程不一定在Master節點上,它可以在任何節點;Worker就是Slave節點,Executor進程必然在Worker節點上,用來進行實際的計算
1、client mode下Driver進程運行在Master節點上,不在Worker節點上,所以相對於參與實際計算的Worker集羣而言,Driver就相當於是一個第三方的“client”
2、正由於Driver進程不在Worker節點上,所以其是獨立的,不會消耗Worker集羣的資源
3、client mode下Master和Worker節點必須處於同一片局域網內,因爲Drive要和Executorr通信,例如Drive需要將Jar包通過Netty HTTP分發到Executor,Driver要給Executor分配任務等
4、client mode下沒有監督重啓機制,Driver進程如果掛了,需要額外的程序重啓
2. cluster mode
1、Driver程序在worker集羣中某個節點,而非Master節點,但是這個節點由Master指定
2、Driver程序佔據Worker的資源
3、cluster mode下Master可以使用–supervise對Driver進行監控,如果Driver掛了可以自動重啓
4、cluster mode下Master節點和Worker節點一般不在同一局域網,因此就無法將Jar包分發到各個Worker,所以cluster mode要求必須提前把Jar包放到各個Worker幾點對應的目錄下面
3. 總結
是選擇client mode還是cluster mode呢?
一般來說,如果提交任務的節點(即Master)和Worker集羣在同一個網絡內,此時client mode比較合適
如果提交任務的節點和Worker集羣相隔比較遠,就會採用cluster mode來最小化Driver和Executor之間的網絡延遲
yarn client模式:driverzai當前提交任務的節點上,可以打印任務運行的日誌信息,而
yarn cluster模式:driver在AppMaster所有節點上,分佈式分配,不能再提交任務的本機打印日誌信息