之前記錄Yarn:Hadoop2.0之YARN組件,這次使用Docker搭建Spark On Yarn
一、各運行模式
1、單機模式
該模式被稱為Local[N]模式,是用單機的多個線程來模擬Spark分布式計算,通常用來驗證開發出來的應用程序邏輯上沒有問題。其中N代表可以使用N個線程,每個線程擁有一個core。如果不指定N,則默認是1個線程(該線程擁有1個core)
指令實例:
1)spark-shell --master local
2)spark-shell --master local[4]代表會有4個線程(每個線程一個core)來並發執行應用程序
運行該模式非常簡單,只需要把Spark的安裝包解壓之后,改一些常用的配置即可使用,而不用啟動Spark的Master 、Worker守護進程(只有集群的Standalone方式時,才需要這兩個角色),也不用啟動Hadoop的各服務(除非必須用到hdfs)這是和其他模式的區別。
2、偽集群模式
該模式和local[N]很像,不同的是。它會在單機啟動多個進程來模擬集群下的分布式場景,而不像Local[N]這種多線程只能在一個進程下共享資源。通常也是用來驗證開發出來的應用程序在邏輯上有沒有問題,或想使用Spark的計算框架而沒有太多資源。
指令實例:
spark-shell --master local-cluster[2,3,1024]
用法:提交應用程序時使用local-cluster[x,y,z],參數:x代表要生成executor數,y和z分別代表每個executor所擁有的core和memory數,上面這條命令表示:會使用2個executor進程,每個進程分配3個core和1G內存來運行應用程序
該模式非常簡單,只需要把spark的安裝包解壓后,改一些常用的配置即可使用。而不用啟動Spark的Master、Worker守護進程(只有集群的standalone方式時,也不用啟動hadoop的各服務)。
3、集群模式1---spark自帶的Cluster Manager的Standalone client模式
和單機運行模式不同,這里必須在執行應用程序前,先啟動Spark的Master和Worker守護進程。不用啟動Hadoop服務,除非必須用到。然后在想要作為Master的節點上用start-all.sh來啟動即可。這樣運行模式,可以使用spark的8080 web ui來觀察資源和應用程序的執行情況
指令實例:
1)spark-shell --master spark://spark01:7077
2)spark-shell --master spark://spark01:7077 --deploy-mode client
產生的進程
①Master進程作為clust manager,用來對應用程序申請的資源進行管理。
②SparkSubmit作為client端和運行Driver程序
③CoarseGrainedExecutorBackend用來並發執行程序
4、集群模式2---spark自帶的Cluster Manager的standalone cluster模式
指令實例:
spark-submit --master spark://spark01:6066 --deploy-mode cluster
與第三種模式的區別:
①客戶端的SparkSubmit進程會在應用程序提交給集群后退出
②Master會在集群中選擇一個Worker進程生成一個子進程DriverWrapper來啟動Driver來啟動程序
③該DriverWrapper進程會占用Worker進程的一個core,所以同樣的資源配置下,會比第三種運行模式,少一個core來參與運算
④應用程序的結果,會在執行Driver程序的節點的sdtout中輸出,而不是打印在屏幕上。
5、集群模式3---基於Yarn的ResourceManager的Client模式
現在越來越多的場景,都是Spark跑在Hadoop集群中,所以為了做到資源能夠均衡調度,會使用Yarn來作為Spark的Cluster的Manager,來為Spark的應用程序分配資源。在執行Spark應用程序之前,要啟動Hadoop的各個服務。由於已經有了資源管理器,所以不需要啟動Spark的Master、Work守護進程。
指令實例:
①spark-shell --master yarn
②spark-shell --master yarn --deploy-mode client
提交應用程序后,各節點會啟動相關JVM進程,如下:
①在ResourceManager節點上提交應用程序,會生成SparkSubmit進程,該進程會執行Driver程序。
②RM會在集群中的某個NodeManager上啟動一個ExecutorLauncher進程來作為ApplicationMaster
③RM也會在多個NodeManager上生成一個CoarseGrainedExecutorBackend進程來並發執行應用程序。
6、集群模式4----基於Yarn的ResourceManager的Cluster模式
指令實例:
①spark-shell --master yarn --deploy-mode client
和第5種的區別如下:
①在ResourceManager端提交應用程序,會生成SparkSubmit進程,該進程只用來做Client端,應用程序提交給集群后,就會刪除該進程
②ResourceManager在集群中的某個NodeManager中運行ApplicationMaster,該AM同時會執行Driver程序,緊接着,各NodeManager上運行CoarseGrainedExecutorBackend來並發執行應用程序
③應用程序的結果,會在執行Driver應用程序的節點的sdtout輸出,而不是打印在屏幕上。
7、Spark On Mesos模式
http://ifeve.com/spark-mesos-spark/
二、Spark On Yarn
官方說明:http://spark.apache.org/docs/latest/running-on-yarn.html、http://spark.apache.org/docs/latest/submitting-applications.html
1、圖解說明

Spark On Yarn模式:Spark集群的資源管理器不是由Master(Cluster Manager)來管理,而是由Yarn的ResourceManager來管理,而Spark的任務調度依然是由SparkContext來調度。
2、環境搭建
本地搭建還是基於之前的環境:使用Docker搭建Spark集群(用於實現網站流量實時分析模塊),基於以上6個容器的Zookeeper集群、hadoop集群等環境來搭建。
Spark on YARN運行模式,只需要在Hadoop分布式集群中任選一個節點安裝配置Spark即可,不要集群安裝。因為Spark應用程序提交到YARN后,YARN會負責集群資源的調度,任選一個hadoop容器來安裝spark即可。
1、啟動Zookeeper集群

2、啟動hadoop集群

3、hadoop0容器安裝配置spark,拷貝編輯spark-env.sh

4、啟動測試
spark的bin目錄執行命令:./spark-shell --master yarn --deploy-mode client

5、Yarn Web界面
可以看到Spark shell應用程序正在運行,單擊ID號鏈接,可以看到該應用程序的詳細信息。


3、問題解決
如果是用虛擬機搭建,可能會由於虛擬機內存過小而導致啟動失敗,比如內存資源過小,yarn會直接kill掉進程導致rpc連接失敗。所以,我們還需要配置Hadoop的yarn-site.xml文件,加入如下兩項配置:

編輯yarn-site.xml添加如下內容即可
<property> <name>yarn.nodemanager.vmem-check-enabled</name> <value>false</value> </property> <property> <name>yarn.nodemanager.pmem-check-enabled</name> <value>false</value> </property>
如有問題,歡迎指正交流~~~~
