Flink運(yùn)行模式有三種:session俐芯、per-job玛歌、Application魂拦。
其中三者核心區(qū)別點(diǎn):1. 集群的生命周期和資源管理隔離程度 2. main()方法的執(zhí)行是在客戶端還是集群。
首先了解下Flink集群架構(gòu):
Session
Session生命周期糯笙,預(yù)先啟動一個長期運(yùn)行的集群妹田,該集群可以接收多個作業(yè)的提交唬党,即使所有作業(yè)完成后,集群仍然繼續(xù)運(yùn)行直到手動停止鬼佣。
資源隔離驶拱,所有作業(yè)共享集群,如果TM崩潰晶衷,此TM運(yùn)行的所有作業(yè)都將失敗蓝纲,如果JM掛了,所有作業(yè)都會受影響晌纫,需要重啟所有作業(yè)税迷。優(yōu)點(diǎn):由于資源預(yù)先分配好,節(jié)省大量的申請資源及啟動TM的時間锹漱。
main()方法在client執(zhí)行箭养,熟悉Flink編程模型的應(yīng)該知道,main()方法執(zhí)行過程中需要拉去任務(wù)的jar包及依賴jar包凌蔬,同時需要做StreamGraph到JobGraph的轉(zhuǎn)換露懒,會給客戶端帶來重大的壓力闯冷。如果多個作業(yè)同時提交客戶端將遇到單點(diǎn)瓶頸砂心。
per-job
生命周期懈词,隨著任務(wù)的提交而創(chuàng)建,隨著任務(wù)結(jié)束而銷毀辩诞。為每個提交的作業(yè)啟動一個集群坎弯,該集群僅可用于改作業(yè),一旦作業(yè)完成集群將會釋放译暂。作業(yè)之間互不影響抠忘。
資源隔離,隔離性最好外永,每個作業(yè)一個集群崎脉。
main()方法在client側(cè)執(zhí)行。
application
生命周期伯顶,無需先啟動Flink集群囚灼,隨著作業(yè)提交而啟動。
資源隔離祭衩,多個job組成一個application運(yùn)行在同一個集群上灶体,比如如果main()方法有多個execute(),這些作業(yè)將視為同一個應(yīng)用掐暮,運(yùn)行在同一集群中蝎抽。而對于per-job模式,會啟動多個集群路克。
main()方法在集群上執(zhí)行而不是客戶端上樟结,客戶端只會把job的jar包等上傳到HDFS,由JM進(jìn)程的集群入口類(ApplicationClusterEntryPoint)執(zhí)行main()方法生成JobGraph等
三種不同的運(yùn)行模式精算,結(jié)合資源管理的不同實(shí)現(xiàn)形成了Flink不同集群啟動的入口類狭吼。具體參考以下類圖:
可以參照類圖,從不同的類出發(fā)探索集群啟動的核心源碼殖妇,詳細(xì)了解集群啟動的奧秘刁笙,關(guān)于StandaloneSessionClusterEntrypoint模式的集群啟動源碼分析可以參考:http://www.reibang.com/p/2ebe954456e4