【Flink系列】Flink執行模式還傻傻分不清?快來看看吧
關注、星標公眾號【 大資料之美 】,和你一起成長
原文連結:
Flink 的部署方式跟 Spark 一樣,是非常靈活的,可以支援Local、Standalone、Yarn、Mesos、Docker、Kubernetes等現在常見的部署模式。這些部署模式是 Flink 計算時所需資源的管理的不同方式,所以可以理解為是資源管理方式。
在具體的應用場景中,如何跟計算資源互動,對於叢集資源分配和佔用的方式,可能會有特定的需求。所以 Flink 為各種場景提供了不同的執行模式,主要有以下三種:
-
會話模式(Session Mode)
-
單作業模式(Per-Job Mode)
-
應用模式(Application Mode)
上述執行模式主要在於叢集的生命週期和資源的分配方式,以及應用程式的 main 方法到底在 Client 還是 JobManager 中執行的區別。接下來我們就做一個展開說明。
1、會話模式(Session Mode)
會話模式需要先啟動一個叢集,保持一個會話,在這個會話中通過客戶端提交作業。叢集啟動時所有資源就都已經確定,所以所有提交的作業會競爭叢集中的資源。這種模式最符合常規思維,有個固定的資源,只要等著任務過來使用資源就可以了。
會話模式
會話模式的優點在於只需要一個叢集,所有的作業提交之後都在這個叢集裡執行,作業結束了就釋放資源,叢集依然正常執行。
缺點是因為資源是共享的,所以資源不夠了,提交新的作業就會失敗。另外,同一個 TaskManager 上可能運行了很多作業,如果其中一個發生故障導致 TaskManager 宕機,在這個上的所有作業都會受到影響。
會話模式比較適合於單個規模小、執行時間短的大量作業。
2、單作業模式(Per-Job Mode)
既然會話模式可能會因為資源共享而導致很多問題,所以為了更好地隔離資源,我們可以考慮為每個提交的作業啟動一個叢集,這就是單作業(Per-Job)模式,這樣作業之間就不會相互影響。
單作業模式
單作業模式就是嚴格的一對一叢集與作業,叢集只為這個作業而生,由客戶端執行應用程式,然後啟動叢集,作業被提交給 JobManager,進而分發給 TaskManager 執行。
作業作業完成後,叢集就會關閉,所有資源也會釋放。可以看出每個作業都有它自己的 JobManager 管理,佔用獨享的資源,即使發生故障,它的 TaskManager 宕機也不會影響其他作業。 這些特性使得單作業模式在生產環境執行更加穩定,所以是實際應用的首選模式。但是 Flink 本身無法直接這樣執行模式,所以單作業模式一般需要藉助一些外部資源管理框架來啟動叢集,比如 YARN、Kubernetes。
3、應用模式(Application Mode)
前面提到的兩種模式下,應用程式碼都是在客戶端上執行,然後由客戶端提交給 JobManager 的。但是這種方式客戶端需要佔用大量網路頻寬,去下載依賴和把二進位制資料傳送給JobManager,如果執行的作業比較多,而且在同一個客戶端提交作業時,就會增加客戶端所在節點的資源消耗,甚至可能導致節點宕機。
解決辦法就是,不通過客戶端直接把應用提交到 JobManger 上執行。而這也就代表著,我們需要為每一個提交的應用單獨啟動一個 JobManager,也就是建立一個叢集。這個 JobManager 只為執行這一個應用而存在,執行結束之後 JobManager 也就關閉了,這就是所謂的應用模式,如下圖:
應用模式
應用模式與單作業模式,都是提交作業之後才建立叢集。單作業模式是通過客戶端來提交的,客戶端解析出的每一個作業對應一個叢集;而應用模式下,只建立一個叢集,直接由 JobManager 執行應用程式的,在 JobManager 上直接呼叫應用程式的main()方法。
寫在最後的話
Flink 支援多種不同的執行模式,還可以和不同的資源管理平臺方便地整合。本文介紹了 Flink 的幾種執行模式的區別,以及不同執行模式的優缺點講解。實際應用時,一般需要和資源管理平臺結合起來,選擇特定的模式來分配資源、部署應用。
本次分享就到這裡,希望你能有所收穫。
碼字不易,歡迎點贊關注。