flink執行時架構
flink執行時的元件
作業管理器(JobManager)
• 控制一個應用程式執行的主程序,也就是說,每個應用程式都會被一個不同的 JobManager 所控制執行。
• JobManager 會先接收到要執行的應用程式,這個應用程式會包括:作業圖 (JobGraph)、邏輯資料流圖(logical dataflow graph)和打包了所有的類、 庫和其它資源的JAR包。
• JobManager 會把JobGraph轉換成一個物理層面的資料流圖,這個圖被叫做 “執行圖”(ExecutionGraph),包含了所有可以併發執行的任務。
• JobManager 會向資源管理器(ResourceManager)請求執行任務必要的資源, 也就是工作管理員(TaskManager)上的插槽(slot)。一旦它獲取到了足夠的 資源,就會將執行圖分發到真正執行它們的TaskManager上。而在執行過程中, JobManager會負責所有需要中央協調的操作,比如說檢查點(checkpoints) 的協調。
工作管理員(TaskManager)
• Flink中的工作程序。通常在Flink中會有多個TaskManager執行,每一 個TaskManager都包含了一定數量的插槽(slots)。插槽的數量限制 了TaskManager能夠執行的任務數量。
• 啟動之後,TaskManager會向資源管理器註冊它的插槽;收到資源管理 器的指令後,TaskManager就會將一個或者多個插槽提供給 JobManager呼叫。JobManager就可以向插槽分配任務(tasks)來 執行了。
• 在執行過程中,一個TaskManager可以跟其它運行同一應用程式的 TaskManager交換資料。
資源管理器(ResourceManager)
• 主要負責管理工作管理員(TaskManager)的插槽(slot), TaskManger 插槽是Flink中定義的處理資源單元。
• Flink為不同的環境和資源管理工具提供了不同資源管理器,比如YARN、 Mesos、K8s,以及standalone部署。
• 當JobManager申請插槽資源時,ResourceManager會將有空閒插槽 的TaskManager分配給JobManager。如果ResourceManager沒有足 夠的插槽來滿足JobManager的請求,它還可以向資源提供平臺發起會 話,以提供啟動TaskManager程序的容器。
分發器(Dispatcher)
• 可以跨作業執行,它為應用提交提供了REST介面。
• 當一個應用被提交執行時,分發器就會啟動並將應用移交給一個 JobManager。
• Dispatcher也會啟動一個Web UI,用來方便地展示和監控作業 執行的資訊。
• Dispatcher在架構中可能並不是必需的,這取決於應用提交執行 的方式
任務提交流程
yarn模式下的提交流程
任務排程原理
思考????
1.怎樣實現平行計算?
多執行緒,不同的任務分配到不同的執行緒,不同的執行緒執行的時候需要不同的執行資源,資源如何分配,這個時候就需要slot,slot就是執行不同的任務,跑不同的執行緒
2.並行的任務,需要佔用多少slot?
這個和最大並行度有關,假如最大的並行度是3,這個時候有七個任務,只需要三個slot就可以了
3.一個流式處理程式,到底包含多少個任務?
slot和任務排程
並行度(Parallelism)
• 一個特定運算元的 子任務(subtask)的個數被稱之為其並行度(parallelism)。 一般情況下,一個 stream 的並行度,可以認為就是其所有運算元中最大的並行度.
TaskManager 和 Slots
• Flink 中每一個 TaskManager 都是一個JVM程序,它可能會在獨立的執行緒上執 行一個或多個子任務
• 為了控制一個 TaskManager 能接收多少個 task, TaskManager 通過 task slot 來進行控制(一個 TaskManager 至少有一個 slot)
TaskManager 和 Slots
• 預設情況下,Flink 允許子任務共享 slot,即使它們是不同任務的子任務。 這樣 的結果是,一個 slot 可以儲存作業的整個管道。
• Task Slot 是靜態的概念,是指 TaskManager 具有的併發執行能力
並行子任務的分配
程式和資料流
• 所有的Flink程式都是由三部分組成的: Source 、Transformation 和 Sink。
• Source 負責讀取資料來源,Transformation 利用各種運算元進行處理加工,Sink 負責輸出
• 在執行時,Flink上執行的程式會被對映成“邏輯資料流”(dataflows),它包 含了這三部分
• 每一個dataflow以一個或多個sources開始以一個或多個sinks結束。dataflow 類似於任意的有向無環圖(DAG)
• 在大部分情況下,程式中的轉換運算(transformations)跟dataflow中的運算元 (operator)是一一對應的關係
執行圖
• Flink 中的執行圖可以分成四層:StreamGraph -> JobGraph -> ExecutionGraph -> 物理執行圖
➢ StreamGraph:是根據使用者通過 Stream API 編寫的程式碼生成的最初的圖。用來 表示程式的拓撲結構。
➢ JobGraph:StreamGraph經過優化後生成了 JobGraph,提交給 JobManager 的資料結構。主要的優化為,將多個符合條件的節點 chain 在一起作為一個節點
➢ ExecutionGraph:JobManager 根據 JobGraph 生成ExecutionGraph。 ExecutionGraph是JobGraph的並行化版本,是排程層最核心的資料結構。
➢ 物理執行圖:JobManager 根據 ExecutionGraph 對 Job 進行排程後,在各個 TaskManager 上部署 Task 後形成的“圖”,並不是一個具體的資料結構。
資料傳輸形式
• 一個程式中,不同的運算元可能具有不同的並行度
• 運算元之間傳輸資料的形式可以是 one-to-one (forwarding) 的模式也可以是 redistributing 的模式,具體是哪一種形式,取決於運算元的種類
➢ One-to-one:stream維護著分割槽以及元素的順序(比如source和map之間)。 這意味著map 運算元的子任務看到的元素的個數以及順序跟 source 運算元的子任務 生產的元素的個數、順序相同。map、fliter、flatMap等運算元都是one-to-one 的對應關係。
➢ Redistributing:stream的分割槽會發生改變。每一個運算元的子任務依據所選擇的 transformation傳送資料到不同的目標任務。例如,keyBy 基於 hashCode 重 分割槽、而 broadcast 和 rebalance 會隨機重新分割槽,這些運算元都會引起 redistribute過程,而 redistribute 過程就類似於 Spark 中的 shuffle 過程。