Flink是一個分散式系統,要求有效地分配和管理計算資源以執行流式應用程式。它集成了所有常見的集群資源管理器,如Hadoop YARN和Kubernetes,但也可以設置為作為standalone甚至庫運行。 本節概述了Flink的體繫結構,並描述了其主要組件如何交互以執行應用程式以及從故障中恢復。 ...
Flink是一個分散式系統,要求有效地分配和管理計算資源以執行流式應用程式。它集成了所有常見的集群資源管理器,如Hadoop YARN和Kubernetes,但也可以設置為作為standalone甚至庫運行。
本節概述了Flink的體繫結構,並描述了其主要組件如何交互以執行應用程式以及從故障中恢復。
Flink集群解析
Flink運行時由兩種類型的進程組成:一個JobManager和一個或多個TaskManager。
Client 不是運行時和程式執行的一部分,而是用於準備數據流並將其發送到JobManager。之後,Client 可以斷開連接(分離模式),或者保持連接以接收進度報告(附加模式)。Client 要麼作為觸發執行的Java/Scala程式的一部分運行,要麼在命令行進程/bin/flink run ...
中運行
JobManager和TaskManager可以通過各種方式啟動:直接在機器上作為standalone啟動,在容器中啟動,或者由YARN等資源框架管理。TaskManager連接到JobManager,宣佈自己可用,並被分配工作。
JobManager
JobManager 有許多與協調Flink應用程式的分散式執行相關的職責:它決定何時安排下一個任務(或一組任務),對已完成或執行失敗的任務做出反應,協調檢查點,並協調故障恢復等。該進程由三個不同的組件組成:
-
ResourceManager
ResourceManager 負責Flink 集群中的資源分配和供應,管理任務槽(task slots) --是Flink集群的資源調度單元。Flink為不同的環境和資源提供商(如YARN、Kubernetes和獨立部署)實現了多個ResourceManager。在standalone設置中,ResourceManager 只能分配可用TaskManager的插槽,不能獨立啟動新的TaskManager。
-
Dispatcher
Dispatcher提供了一個REST介面來提交Flink應用程式以供執行,併為每個提交的Job啟動一個新的JobMaster。同時,Dispatcher還運行Flink WebUI提供job執行信息
-
JobMaster
JobMaster負責管理單個JobGraph的執行。一個Flink cluster中可以同時運行多個job,每個job都有自己的JobMaster。
至少有一個JobManager。一個高可用性設置可能有多個JobManager,其中一個始終是leader,其他則是備用(standby)(請參閱高可用性(HA))。
TaskManager
TaskManager(也稱為worker)執行數據流任務,緩衝和交換數據流。
必須始終至少有一個TaskManager。TaskManager中資源調度的最小單位是任務槽(task slot)。任務槽的數量表示併發處理任務的數量。請註意,可能在一個任務槽中執行多個Operator
Task和運算元(Operator)鏈
對於分散式執行,Flink 將運算元的 subtasks 鏈接成 tasks。每個task由一個線程執行。將將operator鏈接成task是一種有用的優化:它減少了線程切換和緩衝的開銷,併在降低延遲的同時提高了整體吞吐量。可以配置鏈接行為;請參閱chaining docs查看詳細信息。
下圖中的示例數據流由五個Subtask執行,因此由五個並行線程執行
Task Slot(任務槽)和資源
每個worker(TaskManager)都是一個JVM進程,可以在單獨的線程中執行一個或多個子任務。為了控制單個TaskManager接受的任務數,就有了所謂的task slot(至少一個)。
每個 task slot 表示TaskManager的固定資源子集。例如,具有三個slot 的TaskManager會將其托管記憶體的1/3專用於每個插槽。劃分資源意味著subtask不會與其他作業的subtask爭奪托管記憶體,而是有一定數量的保留托管記憶體。請註意,這裡沒有進行CPU隔離;當前slot僅隔離任務的托管記憶體。
通過調整task slot 的數量,用戶可以定義如何將subtask彼此隔離。每個TaskManager有一個slot 意味著每個任務組都在一個單獨的JVM中運行(例如,可以在一個獨立的容器中啟動)。擁有多個slot 意味著更多的subtask共用同一JVM。同一JVM中的任務共用TCP連接(通過多路復用)和心跳消息。它們還可以共用數據集和數據結構,從而減少每個任務的開銷。
預設情況下,Flink允許subtask共用slot ,即使它們是不同task的subtask ,只要來自同一job即可。結果就是,一個slot可以容納job的整個管道。允許這種“slot共用”有兩個主要好處:
- Flink集群所需task slot與job使用的最大並行度保持一樣。不需要計算一個程式總共包含多少任務(具有不同的並行度)。
- 更容易獲得更好的資源利用率。如果沒有“slot共用”,非密集型subtask(source/map()) 將阻塞與資源密集型 subtask(window)一樣多的資源。通過“slot共用”,將示例中的基本並行度從兩個增加到六個,可以充分利用slot資源,同時確保繁重的subtask在TaskManager之間公平分配。
Flink 應用程式執行
- 集群生命周期: Flink應用集群是一個專用的Flink集群,它只執行來自一個Flink應用的job,並且
main()
方法在集群上運行,而不是在client運行。job提交是一個一步到位的過程: 你不需要先啟動Flink集群,然後向現有集群會話提交job ,相反,你將應用程式邏輯和依賴項打包到一個可執行的作業JAR包中,集群入口點(ApplicationClusterEntryPoint
) 負責調用main()
方法來提取JobGraph。這允許你像Kubernetes上的任何其他應用程式一樣部署Flink應用程式。Flink應用程式集群的生命周期因此與Flink應用的生命周期綁定。 - 資源隔離: 在Flink應用集群中,ResourceManager和Dispatcher的作用域為一個Flink應用,它提供了比Flink會話集群更好的隔離。
Flink Session集群
- 集群生命周期: 在Flink會話集群中,客戶端連接到一個預先存在的、長期運行的集群,該集群可以接受多個job提交。即使在所有job完成後,集群(和JobManager) 仍將繼續運行,直到手動停止會話。因此,Flink會話集群的生存期不與任何Flink job的生存期綁定。
- 資源隔離: TaskManager slot由ResourceManager在提交job時分配,併在job完成後釋放。因為所有作業都共用同一個集群,所以在提交job階段存在一些集群資源競爭,比如網路帶寬。這種共用設置的一個限制是,如果一個TaskManager崩潰,那麼所有在該TaskManager上運行任務的job都將失敗;類似的,如果JobManager上發生一些致命錯誤,它將影響集群中運行的所有job。
- 其他註意事項: 擁有預先存在的集群可以節省大量申請資源和啟動TaskManager的時間。在job的執行時間非常短,且啟動時間過長會對端到端用戶體驗產生負面影響的情況下,這一點很重要——短查詢的互動式分析就是這樣,希望job可以使用現有資源快速執行計算。
以前,Flink會話集群也稱為session mode
下的Flink集群。
參考鏈接
https://nightlies.apache.org/flink/flink-docs-master/docs/concepts/flink-architecture/
作者:授客
微信/QQ:1033553122
全國軟體測試QQ交流群:7156436
Git地址:https://gitee.com/ishouke
友情提示:限於時間倉促,文中可能存在錯誤,歡迎指正、評論!
作者五行缺錢,如果覺得文章對您有幫助,請掃描下邊的二維碼打賞作者,金額隨意,您的支持將是我繼續創作的源動力,打賞後如有任何疑問,請聯繫我!!!
微信打賞
支付寶打賞 全國軟體測試交流QQ群