1,測試或實驗性質的本地運行模式 (單機)web
該模式被稱爲Local[N]模式,是用單機的多個線程來模擬Spark分佈式計算,一般用來驗證開發出來的應用程序邏輯上有沒有問題。shell
其中N表明可使用N個線程,每一個線程擁有一個core。若是不指定N,則默認是1個線程(該線程有1個core)。服務器
若是是local[*],則表明 Run Spark locally with as many worker threads as logical cores on your machine.併發
以下:app
spark-submit 和 spark-submit --master local 效果是同樣的框架
(同理:spark-shell 和 spark-shell --master local 效果是同樣的)
分佈式spark-submit --master local[4] 表明會有4個線程(每一個線程一個core)來併發執行應用程序。oop
那麼,這些線程都運行在什麼進程下呢?後面會說到,請接着往下看。測試
運行該模式很是簡單,只須要把Spark的安裝包解壓後,改一些經常使用的配置便可使用,而不用啓動Spark的Master、Worker守護進程( 只有集羣的Standalone方式時,才須要這兩個角色),也不用啓動Hadoop的各服務(除非你要用到HDFS),這是和其餘模式的區別哦,要記住才能理解。ui
那麼,這些執行任務的線程,究竟是共享在什麼進程中呢?
咱們用以下命令提交做業:
spark-submit --class JavaWordCount --master local[10] JavaWordCount.jar file:///tmp/test.txt
能夠看到,在程序執行過程當中,只會生成一個SparkSubmit進程。
這個SparkSubmit進程又當爹、又當媽,既是客戶提交任務的Client進程、又是Spark的driver程序、還充當着Spark執行Task的Executor角色。(以下圖所示:driver的web ui)
這裏有個小插曲,由於driver程序在應用程序結束後就會終止,那麼如何在web界面看到該應用程序的執行狀況呢,須要如此這般:(以下圖所示)
先在spark-env.sh 增長SPARK_HISTORY_OPTS;
而後啓動start-history-server.sh服務;
就能夠看到啓動了HistoryServer進程,且監聽端口是18080。
以後就能夠在web上使用http://hostname:18080愉快的玩耍了。
想必大家已經清楚了第一種運行模式了吧,咱們接着往下說。
2,測試或實驗性質的本地僞集羣運行模式(單機模擬集羣)
這種運行模式,和Local[N]很像,不一樣的是,它會在單機啓動多個進程來模擬集羣下的分佈式場景,而不像Local[N]這種多個線程只能在一個進程下委屈求全的共享資源。一般也是用來驗證開發出來的應用程序邏輯上有沒有問題,或者想使用Spark的計算框架而沒有太多資源。
用法是:提交應用程序時使用local-cluster[x,y,z]參數:x表明要生成的executor數,y和z分別表明每一個executor所擁有的core和memory數。
spark-submit --master local-cluster[2, 3, 1024]
(同理:spark-shell --master local-cluster[2, 3, 1024]用法也是同樣的)
上面這條命令表明會使用2個executor進程,每一個進程分配3個core和1G的內存,來運行應用程序。能夠看到,在程序執行過程當中,會生成以下幾個進程:
SparkSubmit依然充當全能角色,又是Client進程,又是driver程序,還有點資源管理的做用。生成的兩個CoarseGrainedExecutorBackend,就是用來併發執行程序的進程。它們使用的資源以下:
運行該模式依然很是簡單,只須要把Spark的安裝包解壓後,改一些經常使用的配置便可使用。而不用啓動Spark的Master、Worker守護進程( 只有集羣的standalone方式時,才須要這兩個角色),也不用啓動Hadoop的各服務(除非你要用到HDFS),這是和其餘模式的區別哦,要記住才能理解。下面說說集羣上的運行模式。
3,Spark自帶Cluster Manager的Standalone Client模式(集羣)
終於說到了體現分佈式計算價值的地方了!(有了前面的基礎,後面的內容我會稍微說快一點,只講本文的關注點)
和單機運行的模式不一樣,這裏必須在執行應用程序前,先啓動Spark的Master和Worker守護進程。不用啓動Hadoop服務,除非你用到了HDFS的內容。
start-master.sh
start-slave.sh -h hostname url:master
圖省事,能夠在想要作爲Master的節點上用start-all.sh一條命令便可,不過這樣作,和上面的分開配置有點差異,之後講到數據本地性如何驗證時會說。
啓動的進程以下:(其餘非Master節點上只會有Worker進程)
這種運行模式,可使用Spark的8080 web ui來觀察資源和應用程序的執行狀況了。
能夠看到,當前環境下,我啓動了8個worker進程,每一個可以使用的core是2個,內存沒有限制。
言歸正傳,用以下命令提交應用程序
spark-submit --master spark://wl1:7077
或者 spark-submit --master spark://wl1:7077 --deploy-mode client
表明着會在全部有Worker進程的節點上啓動Executor來執行應用程序,此時產生的JVM進程以下:(非master節點,除了沒有Master、SparkSubmit,其餘進程都同樣)
Master進程作爲cluster manager,用來對應用程序申請的資源進行管理;
SparkSubmit 作爲Client端和運行driver程序;
CoarseGrainedExecutorBackend 用來併發執行應用程序;
注意,Worker進程生成幾個Executor,每一個Executor使用幾個core,這些均可以在spark-env.sh裏面配置,此處不在囉嗦。
4,spark自帶cluster manager的standalone cluster模式(集羣)
這種運行模式和上面第3個仍是有很大的區別的。使用以下命令執行應用程序(前提是已經啓動了spark的Master、Worker守護進程)不用啓動Hadoop服務,除非你用到了HDFS的內容。
spark-submit --master spark://wl1:6066 --deploy-mode cluster
各節點啓動的JVM進程狀況以下:
master節點上的進程
提交應用程序的客戶端上的進程
某worker節點上的進程
客戶端的SparkSubmit進程會在應用程序提交給集羣以後就退出(區別1)
Master會在集羣中選擇一個Worker進程生成一個子進程DriverWrapper來啓動driver程序(區別2)
而該DriverWrapper 進程會佔用Worker進程的一個core,因此一樣的資源下配置下,會比第3種運行模式,少用1個core來參與計算(觀察下圖executor id 7的core數)(區別3)
應用程序的結果,會在執行driver程序的節點的stdout中輸出,而不是打印在屏幕上(區別4)
5,基於YARN的Resource Manager的Client模式(集羣)
如今愈來愈多的場景,都是Spark跑在Hadoop集羣中,因此爲了作到資源可以均衡調度,會使用YARN來作爲Spark的Cluster Manager,來爲Spark的應用程序分配資源。
在執行Spark應用程序前,要啓動Hadoop的各類服務。因爲已經有了資源管理器,因此不須要啓動Spark的Master、Worker守護進程。相關配置的修改,請自行研究。
使用以下命令執行應用程序
spark-submit --master yarn
或者 spark-submit --master yarn --deploy-mode client
提交應用程序後,各節點會啓動相關的JVM進程,以下:
在Resource Manager節點上提交應用程序,會生成SparkSubmit進程,該進程會執行driver程序。
RM會在集羣中的某個NodeManager上,啓動一個ExecutorLauncher進程,來作爲
ApplicationMaster。另外,也會在多個NodeManager上生成CoarseGrainedExecutorBackend進程來併發的執行應用程序。
對應的YARN資源管理的單元Container,關係以下:
爲ApplicationMaster生成了容器 000001;
爲CoarseGrainedExecutorBackend生成了容器 000002-000003
6,基於YARN的Resource Manager的Custer模式(集羣)
使用以下命令執行應用程序:
spark-submit --master yarn --deploy-mode cluster
和第5種運行模式,區別以下:
在Resource Manager端提交應用程序,會生成SparkSubmit進程,該進程只用來作Client端,應用程序提交給集羣后,就會刪除該進程。
Resource Manager在集羣中的某個NodeManager上運行ApplicationMaster,該AM同時會執行driver程序。緊接着,會在各NodeManager上運行CoarseGrainedExecutorBackend來併發執行應用程序。
應用程序的結果,會在執行driver程序的節點的stdout中輸出,而不是打印在屏幕上。
對應的YARN資源管理的單元Container,關係以下:
爲ApplicationMaster生成了容器 000001
爲CoarseGrainedExecutorBackend生成了容器 000002-000003
固然,3-6這幾種運行模式,你也能夠在一臺單機上玩,前提是你的服務器足夠牛,同時你也足夠無聊。
歡迎指正,轉載請標明做者和出處,謝謝。