早就想寫這章了识埋,一直懶得動筆凡伊,不過還好,總算靜下心來完成了窒舟。
剛接觸Spark時系忙,很希望能對它的運行方式有個直觀的了解,而Spark同時支持多種運行模式惠豺,官網(wǎng)和書籍中對他們的區(qū)別所說不詳银还,尤其是模式之間是否有關(guān)聯(lián)、啟動的JVM進程是否有區(qū)別洁墙、啟動的JVM進程的作用是否都一樣蛹疯,等等這些都沒有說明,也沒有現(xiàn)成的資料可以查詢热监。
所以苍苞,我今天總結(jié)一下,供新手參考和學(xué)習(xí)(下述結(jié)論基于Spark2.1.0版本和hadoop2.7.3版本)
1狼纬,測試或?qū)嶒炐再|(zhì)的本地運行模式 (單機)
該模式被稱為Local[N]模式羹呵,是用單機的多個線程來模擬Spark分布式計算,通常用來驗證開發(fā)出來的應(yīng)用程序邏輯上有沒有問題疗琉。
其中N代表可以使用N個線程冈欢,每個線程擁有一個core。如果不指定N盈简,則默認是1個線程(該線程有1個core)凑耻。
如果是local[*],則代表 Run Spark locally with as many worker threads as logical cores on your machine.
如下:
spark-submit 和 spark-submit --master local 效果是一樣的
(同理:spark-shell 和 spark-shell --master local 效果是一樣的)
spark-submit --master local[4] 代表會有4個線程(每個線程一個core)來并發(fā)執(zhí)行應(yīng)用程序柠贤。
那么香浩,這些線程都運行在什么進程下呢?后面會說到臼勉,請接著往下看邻吭。
運行該模式非常簡單,只需要把Spark的安裝包解壓后宴霸,改一些常用的配置即可使用囱晴,而不用啟動Spark的Master膏蚓、Worker守護進程( 只有集群的Standalone方式時,才需要這兩個角色)畸写,也不用啟動Hadoop的各服務(wù)(除非你要用到HDFS)驮瞧,這是和其他模式的區(qū)別哦,要記住才能理解枯芬。
那么论笔,這些執(zhí)行任務(wù)的線程,到底是共享在什么進程中呢千所?
我們用如下命令提交作業(yè):
spark-submit --class JavaWordCount --master local[10] JavaWordCount.jar file:///tmp/test.txt?
可以看到狂魔,在程序執(zhí)行過程中,只會生成一個SparkSubmit進程真慢。
這個SparkSubmit進程又當(dāng)?shù)汶⒂之?dāng)媽,既是客戶提交任務(wù)的Client進程黑界、又是Spark的driver程序管嬉、還充當(dāng)著Spark執(zhí)行Task的Executor角色。(如下圖所示:driver的web ui)
這里有個小插曲朗鸠,因為driver程序在應(yīng)用程序結(jié)束后就會終止蚯撩,那么如何在web界面看到該應(yīng)用程序的執(zhí)行情況呢,需要如此這般:(如下圖所示)
先在spark-env.sh 增加SPARK_HISTORY_OPTS烛占;
然后啟動start-history-server.sh服務(wù)胎挎;
就可以看到啟動了HistoryServer進程,且監(jiān)聽端口是18080忆家。
之后就可以在web上使用http://hostname:18080愉快的玩耍了犹菇。
想必你們已經(jīng)清楚了第一種運行模式了吧,我們接著往下說芽卿。
2揭芍,測試或?qū)嶒炐再|(zhì)的本地偽集群運行模式(單機模擬集群)
這種運行模式,和Local[N]很像卸例,不同的是称杨,它會在單機啟動多個進程來模擬集群下的分布式場景,而不像Local[N]這種多個線程只能在一個進程下委屈求全的共享資源筷转。通常也是用來驗證開發(fā)出來的應(yīng)用程序邏輯上有沒有問題姑原,或者想使用Spark的計算框架而沒有太多資源。
用法是:提交應(yīng)用程序時使用local-cluster[x,y,z]參數(shù):x代表要生成的executor數(shù)呜舒,y和z分別代表每個executor所擁有的core和memory數(shù)锭汛。
? spark-submit --master local-cluster[2, 3, 1024]
(同理:spark-shell --master local-cluster[2, 3, 1024]用法也是一樣的)
上面這條命令代表會使用2個executor進程,每個進程分配3個core和1G的內(nèi)存,來運行應(yīng)用程序店乐〖杼桑可以看到呻袭,在程序執(zhí)行過程中眨八,會生成如下幾個進程:
SparkSubmit依然充當(dāng)全能角色,又是Client進程左电,又是driver程序廉侧,還有點資源管理的作用。生成的兩個CoarseGrainedExecutorBackend篓足,就是用來并發(fā)執(zhí)行程序的進程段誊。它們使用的資源如下:
運行該模式依然非常簡單,只需要把Spark的安裝包解壓后栈拖,改一些常用的配置即可使用连舍。而不用啟動Spark的Master、Worker守護進程( 只有集群的standalone方式時涩哟,才需要這兩個角色)索赏,也不用啟動Hadoop的各服務(wù)(除非你要用到HDFS),這是和其他模式的區(qū)別哦贴彼,要記住才能理解潜腻。下面說說集群上的運行模式。
3器仗,Spark自帶Cluster Manager的Standalone Client模式(集群)
終于說到了體現(xiàn)分布式計算價值的地方了H诨痢(有了前面的基礎(chǔ),后面的內(nèi)容我會稍微說快一點精钮,只講本文的關(guān)注點)
和單機運行的模式不同威鹿,這里必須在執(zhí)行應(yīng)用程序前,先啟動Spark的Master和Worker守護進程轨香。不用啟動Hadoop服務(wù)忽你,除非你用到了HDFS的內(nèi)容。
start-master.sh
start-slave.sh -h hostname url:master
圖省事弹沽,可以在想要做為Master的節(jié)點上用start-all.sh一條命令即可檀夹,不過這樣做,和上面的分開配置有點差別策橘,以后講到數(shù)據(jù)本地性如何驗證時會說炸渡。
啟動的進程如下:(其他非Master節(jié)點上只會有Worker進程)
這種運行模式,可以使用Spark的8080 web ui來觀察資源和應(yīng)用程序的執(zhí)行情況了丽已。
可以看到蚌堵,當(dāng)前環(huán)境下,我啟動了8個worker進程,每個可使用的core是2個吼畏,內(nèi)存沒有限制督赤。
言歸正傳,用如下命令提交應(yīng)用程序
spark-submit --master spark://wl1:7077
或者 spark-submit --master spark://wl1:7077 --deploy-mode client
代表著會在所有有Worker進程的節(jié)點上啟動Executor來執(zhí)行應(yīng)用程序泻蚊,此時產(chǎn)生的JVM進程如下:(非master節(jié)點躲舌,除了沒有Master、SparkSubmit性雄,其他進程都一樣)
Master進程做為cluster manager没卸,用來對應(yīng)用程序申請的資源進行管理;
SparkSubmit 做為Client端和運行driver程序秒旋;
CoarseGrainedExecutorBackend 用來并發(fā)執(zhí)行應(yīng)用程序约计;
注意,Worker進程生成幾個Executor迁筛,每個Executor使用幾個core煤蚌,這些都可以在spark-env.sh里面配置,此處不在啰嗦细卧。
4,spark自帶cluster manager的standalone cluster模式(集群)
這種運行模式和上面第3個還是有很大的區(qū)別的酒甸。使用如下命令執(zhí)行應(yīng)用程序(前提是已經(jīng)啟動了spark的Master魄健、Worker守護進程)不用啟動Hadoop服務(wù),除非你用到了HDFS的內(nèi)容插勤。
spark-submit --master spark://wl1:6066 --deploy-mode cluster
各節(jié)點啟動的JVM進程情況如下:
master節(jié)點上的進程
提交應(yīng)用程序的客戶端上的進程
某worker節(jié)點上的進程
客戶端的SparkSubmit進程會在應(yīng)用程序提交給集群之后就退出(區(qū)別1)
Master會在集群中選擇一個Worker進程生成一個子進程DriverWrapper來啟動driver程序(區(qū)別2)
而該DriverWrapper 進程會占用Worker進程的一個core沽瘦,所以同樣的資源下配置下,會比第3種運行模式农尖,少用1個core來參與計算(觀察下圖executor id 7的core數(shù))(區(qū)別3)
應(yīng)用程序的結(jié)果析恋,會在執(zhí)行driver程序的節(jié)點的stdout中輸出,而不是打印在屏幕上(區(qū)別4)
5盛卡,基于YARN的Resource Manager的Client模式(集群)
現(xiàn)在越來越多的場景助隧,都是Spark跑在Hadoop集群中,所以為了做到資源能夠均衡調(diào)度滑沧,會使用YARN來做為Spark的Cluster Manager并村,來為Spark的應(yīng)用程序分配資源。
在執(zhí)行Spark應(yīng)用程序前滓技,要啟動Hadoop的各種服務(wù)哩牍。由于已經(jīng)有了資源管理器,所以不需要啟動Spark的Master令漂、Worker守護進程膝昆。相關(guān)配置的修改丸边,請自行研究。
使用如下命令執(zhí)行應(yīng)用程序
spark-submit --master yarn?
或者 spark-submit --master yarn --deploy-mode client
提交應(yīng)用程序后荚孵,各節(jié)點會啟動相關(guān)的JVM進程妹窖,如下:
在Resource Manager節(jié)點上提交應(yīng)用程序,會生成SparkSubmit進程收叶,該進程會執(zhí)行driver程序骄呼。
RM會在集群中的某個NodeManager上,啟動一個ExecutorLauncher進程滔驾,來做為
ApplicationMaster谒麦。另外俄讹,也會在多個NodeManager上生成CoarseGrainedExecutorBackend進程來并發(fā)的執(zhí)行應(yīng)用程序哆致。
對應(yīng)的YARN資源管理的單元Container,關(guān)系如下:
為ApplicationMaster生成了容器 000001;
為CoarseGrainedExecutorBackend生成了容器 000002-000003
6患膛,基于YARN的Resource Manager的Custer模式(集群)
使用如下命令執(zhí)行應(yīng)用程序:
spark-submit --master yarn --deploy-mode cluster
和第5種運行模式摊阀,區(qū)別如下:
在Resource Manager端提交應(yīng)用程序,會生成SparkSubmit進程踪蹬,該進程只用來做Client端胞此,應(yīng)用程序提交給集群后,就會刪除該進程跃捣。
Resource Manager在集群中的某個NodeManager上運行ApplicationMaster漱牵,該AM同時會執(zhí)行driver程序。緊接著疚漆,會在各NodeManager上運行CoarseGrainedExecutorBackend來并發(fā)執(zhí)行應(yīng)用程序酣胀。
應(yīng)用程序的結(jié)果,會在執(zhí)行driver程序的節(jié)點的stdout中輸出娶聘,而不是打印在屏幕上闻镶。
對應(yīng)的YARN資源管理的單元Container,關(guān)系如下:
為ApplicationMaster生成了容器 000001
為CoarseGrainedExecutorBackend生成了容器 000002-000003
當(dāng)然丸升,3-6這幾種運行模式铆农,你也可以在一臺單機上玩,前提是你的服務(wù)器足夠牛狡耻,同時你也足夠無聊墩剖。
歡迎指正,轉(zhuǎn)載請標明作者和出處夷狰,謝謝岭皂。