文章目錄
- Dataflow編程
- 執行圖
- 并行度
- 資料傳輸策略
- 任務鏈
Dataflow編程
顧名思義,Dataflow程式描述了資料如何在不同操作之間流動,Dataflow程式通常表現為有向無環圖(DAG),圖中頂點稱為算子(Operator),表示計算,而邊表示資料依賴關系,
算子是Dataflow程式的基本功能單元,他們從輸入獲取資料,對其進行計算,然后產生資料并發往輸出以供后續處理,而所有Flink程式都由三部分算子組成,
- Source(資料源):負責獲取輸入資料,
- Transformation(資料處理):對資料進行處理加工,通常對應著多個算子,
- Sink(資料匯):負責輸出資料,
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ptxbclLs-1613275222681)(/Users/bytedance/Desktop/screenshot-20210205-031419.png)]](https://img.uj5u.com/2021/02/15/224664151050481.png)
執行圖
類似上圖的Dataflow圖被稱為邏輯圖,因為它們表達了高層視角下的計算邏輯,為了執行Dataflow程式,需要將邏輯圖轉化為物理Dataflow圖(執行圖),后者會指定程式的執行細節,
在Flink中,執行圖按層級順序分為以下四層
- StreamingGraph
- 是根據用戶通過Stream API撰寫的代碼生成的初始流程圖,用于表示程式的拓撲結構,
- JobGraph
- StreamGraph經過優化后生成了JobGraph,提交給JobManager的資料結構,主要的優化為將多個符合條件的節點鏈接在一起作為一個節點(任務鏈Operator Chains)后放在一個作業中執行,這樣可以減少資料在節點之間流動所需要的序列化/反序列化/傳輸消耗,
- ExecutionGraph
- JobManager根據JobGraph生成ExecutionGraph,ExecutionGraph是JobGraph的并行化版本,是調度層最核心的資料結構,
- 物理執行圖
- JobManager根據ExecutionGraph對任務進行調度后,在各個TaskManager上部署作業后形成的“圖”,并不是一個具體的資料結構,
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-5FYjNVTC-1613275222683)(/Users/bytedance/Desktop/TB1tA_GJFXXXXapXFXXXXXXXXXX.png)]](https://img.uj5u.com/2021/02/15/224664151050482.png)
并行度
Flink程式的執行具有并行、分布式的特性,
在執行程序中,一個Stream包含一個或多個磁區(partition),而每一個算子(operator)可以包含一個或多個子任務(operator subtask),這些子任務中不同的執行緒、不同的物理機或不同的容器中彼此互不依賴地執行,
一個特定算子的子任務的個數被稱之為并行度(paralelism),一般情況下一個流程式的并行度可以認為就是其所有算子中最大的并行度,一個程式中不同的算子可以具有不同的并行度,
資料傳輸策略
Stream在算子之間傳輸資料的形式可以是one-to-one(forwarding)的模式也可以是Redistributing的模式,具體是哪一種需要取決于算子的種類,
- One-to-one
- Stream維護著磁區以及元素的順序(比如在Source和map operator之間),那意味著map算子的子任務看到的元素的個數以及順序跟Source算子的子任務生產的元素的個數、順序相同,map、filter、flatmap等算子都是one-to-one的對應關系,
- 類似于Spark中的窄依賴,
- Redistributing
- Stream的磁區會發生改變(map()跟keyBy/window之間或者keyBy/windows跟Sink之間),每一個算子的子任務依據所選擇的Transformation發送資料到不同的目標任務,
- 例如keyBy()基于hashCode重磁區、broadcast和rebalance會隨機重新磁區,這些算子都會引起redistribute程序,而redistribute程序就類似于Spark中的shuffle程序,
- 類似于Spark中的寬依賴,
任務鏈
Flink 采用了一種稱為任務鏈的優化技術,可以在特定條件下減少本地通信的開銷,為了滿足任務鏈的要求,必須將兩個或多個算子設為相同的并行度,并通過**本地轉發(local forward)**的方式進行連接,
相同并行度的 one-to-one 操作 (兩個條件缺一不可) ,Flink 這樣相連的算子鏈接在一起形成一個 task,原來的算子成為里面的 subtask,每個 task 由一個執行緒執行,將算子鏈接成 task 是個有用的優化:它減少執行緒間切換、緩沖的開銷,并且減少延遲的同時增加整體吞吐量,
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-w5DVC7Xr-1613275222684)(/Users/bytedance/Desktop/screenshot-20210207-064257.png)]](https://img.uj5u.com/2021/02/15/224664151050483.png)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/259679.html
標籤:其他
下一篇:gcc升級高版本
