看了之后不再迷糊-Spark多種運行模式

早就想寫這章了识埋,一直懶得動筆凡伊,不過還好,總算靜下心來完成了窒舟。

剛接觸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里面配置,此處不在啰嗦细卧。

這是driver web ui的顯示尉桩,可以看到每個executor的資源使用情況


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)載請標明作者和出處夷狰,謝謝岭皂。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市孵淘,隨后出現(xiàn)的幾起案子蒲障,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件揉阎,死亡現(xiàn)場離奇詭異庄撮,居然都是意外死亡,警方通過查閱死者的電腦和手機毙籽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門洞斯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人坑赡,你說我怎么就攤上這事烙如。” “怎么了毅否?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵亚铁,是天一觀的道長。 經(jīng)常有香客問我螟加,道長徘溢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任捆探,我火速辦了婚禮然爆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘黍图。我一直安慰自己曾雕,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布助被。 她就那樣靜靜地躺著剖张,像睡著了一般。 火紅的嫁衣襯著肌膚如雪恰起。 梳的紋絲不亂的頭發(fā)上修械,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機與錄音检盼,去河邊找鬼肯污。 笑死,一個胖子當(dāng)著我的面吹牛吨枉,可吹牛的內(nèi)容都是我干的蹦渣。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼貌亭,長吁一口氣:“原來是場噩夢啊……” “哼柬唯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起圃庭,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤锄奢,失蹤者是張志新(化名)和其女友劉穎失晴,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拘央,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡涂屁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了灰伟。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拆又。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖栏账,靈堂內(nèi)的尸體忽然破棺而出帖族,到底是詐尸還是另有隱情,我是刑警寧澤挡爵,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布竖般,位于F島的核電站,受9級特大地震影響了讨,放射性物質(zhì)發(fā)生泄漏捻激。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一前计、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧垃杖,春花似錦男杈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至彩库,卻和暖如春肤无,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背骇钦。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工宛渐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人眯搭。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓窥翩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鳞仙。 傳聞我的和親對象是個殘疾皇子寇蚊,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容