前言
長(zhǎng)久以來(lái),在YARN集群中部署Flink作業(yè)有兩種模式,即Session Mode和Per-Job Mode,而在Flink 1.11版本中,又引入了第三種全新的模式:Application Mode爷速。本文先回顧兩種傳統(tǒng)模式的做法與存在的問(wèn)題,再簡(jiǎn)要介紹Application Mode霞怀。
傳統(tǒng)部署模式
Session模式
Session模式是預(yù)分配資源的遍希,也就是提前根據(jù)指定的資源參數(shù)初始化一個(gè)Flink集群,并常駐在YARN系統(tǒng)中里烦,擁有固定數(shù)量的JobManager和TaskManager(注意JobManager只有一個(gè))凿蒜。提交到這個(gè)集群的作業(yè)可以直接運(yùn)行,免去每次分配資源的overhead胁黑。但是Session的資源總量有限废封,多個(gè)作業(yè)之間又不是隔離的,故可能會(huì)造成資源的爭(zhēng)用丧蘸;如果有一個(gè)TaskManager宕機(jī)漂洋,它上面承載著的所有作業(yè)也都會(huì)失敗。另外力喷,啟動(dòng)的作業(yè)越多刽漂,JobManager的負(fù)載也就越大。所以弟孟,Session模式一般用來(lái)部署那些對(duì)延遲非常敏感但運(yùn)行時(shí)長(zhǎng)較短的作業(yè)贝咙。
Per-Job模式
顧名思義,在Per-Job模式下拂募,每個(gè)提交到Y(jié)ARN上的作業(yè)會(huì)各自形成單獨(dú)的Flink集群庭猩,擁有專(zhuān)屬的JobManager和TaskManager窟她。可見(jiàn)蔼水,以Per-Job模式提交作業(yè)的啟動(dòng)延遲可能會(huì)較高震糖,但是作業(yè)之間的資源完全隔離,一個(gè)作業(yè)的TaskManager失敗不會(huì)影響其他作業(yè)的運(yùn)行趴腋,JobManager的負(fù)載也是分散開(kāi)來(lái)的吊说,不存在單點(diǎn)問(wèn)題。當(dāng)作業(yè)運(yùn)行完成优炬,與它關(guān)聯(lián)的集群也就被銷(xiāo)毀颁井,資源被釋放。所以穿剖,Per-Job模式一般用來(lái)部署那些長(zhǎng)時(shí)間運(yùn)行的作業(yè)蚤蔓。
存在的問(wèn)題
上文所述Session模式和Per-Job模式可以用如下的簡(jiǎn)圖表示卦溢,其中紅色糊余、藍(lán)色和綠色的圖形代表不同的作業(yè)。
Deployer代表向YARN集群發(fā)起部署請(qǐng)求的節(jié)點(diǎn)单寂,一般來(lái)講在生產(chǎn)環(huán)境中贬芥,也總有這樣一個(gè)節(jié)點(diǎn)作為所有作業(yè)的提交入口(即客戶端)。在main()方法開(kāi)始執(zhí)行直到env.execute()方法之前宣决,客戶端也需要做一些工作蘸劈,即:
- 獲取作業(yè)所需的依賴(lài)項(xiàng);
- 通過(guò)執(zhí)行環(huán)境分析并取得邏輯計(jì)劃尊沸,即StreamGraph→JobGraph威沫;
- 將依賴(lài)項(xiàng)和JobGraph上傳到集群中。
只有在這些都完成之后洼专,才會(huì)通過(guò)env.execute()方法觸發(fā)Flink運(yùn)行時(shí)真正地開(kāi)始執(zhí)行作業(yè)棒掠。試想,如果所有用戶都在Deployer上提交作業(yè)屁商,較大的依賴(lài)會(huì)消耗更多的帶寬烟很,而較復(fù)雜的作業(yè)邏輯翻譯成JobGraph也需要吃掉更多的CPU和內(nèi)存,客戶端的資源反而會(huì)成為瓶頸——不管Session還是Per-Job模式都存在此問(wèn)題蜡镶。為了解決它雾袱,社區(qū)在傳統(tǒng)部署模式的基礎(chǔ)上實(shí)現(xiàn)了Application模式。
Application模式
此模式下的作業(yè)提交框圖如下官还。
可見(jiàn)芹橡,原本需要客戶端做的三件事被轉(zhuǎn)移到了JobManager里,也就是說(shuō)main()方法在集群中執(zhí)行(入口點(diǎn)位于ApplicationClusterEntryPoint)望伦,Deployer只需要負(fù)責(zé)發(fā)起部署請(qǐng)求了僻族。另外粘驰,如果一個(gè)main()方法中有多個(gè)env.execute()/executeAsync()調(diào)用,在Application模式下述么,這些作業(yè)會(huì)被視為屬于同一個(gè)應(yīng)用蝌数,在同一個(gè)集群中執(zhí)行(如果在Per-Job模式下,就會(huì)啟動(dòng)多個(gè)集群)度秘《ド。可見(jiàn),Application模式本質(zhì)上是Session和Per-Job模式的折衷剑梳。
用Application模式提交作業(yè)的示例命令如下唆貌。
bin/flink run-application -t yarn-application \
-Djobmanager.memory.process.size=2048m \
-Dtaskmanager.memory.process.size=4096m \
-Dtaskmanager.numberOfTaskSlots=2 \
-Dparallelism.default=10 \
-Dyarn.application.name="MyFlinkApp" \
/path/to/my/flink-app/MyFlinkApp.jar
-t
參數(shù)用來(lái)指定部署目標(biāo),目前支持YARN(yarn-application
)和K8S(kubernetes-application
)垢乙。-D
參數(shù)則用來(lái)指定與作業(yè)相關(guān)的各項(xiàng)參數(shù)锨咙,具體可參見(jiàn)官方文檔。
那么如何解決傳輸依賴(lài)項(xiàng)造成的帶寬占用問(wèn)題呢追逮?Flink作業(yè)必須的依賴(lài)是發(fā)行包flink-dist.jar酪刀,還有擴(kuò)展庫(kù)(位于$FLINK_HOME/lib)和插件庫(kù)(位于$FLINK_HOME/plugin),我們將它們預(yù)先上傳到像HDFS這樣的共享存儲(chǔ)钮孵,再通過(guò)yarn.provided.lib.dirs
參數(shù)指定存儲(chǔ)的路徑即可骂倘。
-Dyarn.provided.lib.dirs="hdfs://myhdfs/flink-common-deps/lib;hdfs://myhdfs/flink-common-deps/plugins"
這樣所有作業(yè)就不必各自上傳依賴(lài),可以直接從HDFS拉取巴席,并且YARN NodeManager也會(huì)緩存這些依賴(lài)历涝,進(jìn)一步加快作業(yè)的提交過(guò)程。同理漾唉,包含F(xiàn)link作業(yè)的用戶JAR包也可以上傳到HDFS荧库,并指定遠(yuǎn)程路徑進(jìn)行提交。
The End
明天早起搬磚赵刑,民那晚安晚安分衫。