2.4 Flink運行時架構:Task、SubTask、ExecutionGraph的關系

在理解Flink運行時架構之前,我們先用一個生活化的比喻來建立直觀認識:

想象你是一家大型工廠的總經理,需要生產一批復雜的產品。你會怎么做?

  1. 制定生產計劃:首先畫出生產流程圖,明確每個環節的工作內容
  2. 分解任務:將復雜的生產過程分解為多個可并行的工序
  3. 分配工人:為每個工序安排合適數量的工人并行作業
  4. 協調執行:確保各個工序之間的協調配合

Flink的運行時架構正是這樣一個"智能工廠"的管理系統。

ExecutionGraph:生產總指揮圖

什么是ExecutionGraph?

ExecutionGraph就像是工廠的總生產指揮圖,它是Flink程序在運行時的完整執行計劃。

// 用戶編寫的Flink程序(簡化示例)
DataStream<String> source = env.addSource(new FlinkKafkaConsumer<>(...));
DataStream<WordCount> counts = source.flatMap(new Tokenizer())           // 分詞算子.keyBy(value -> value.word)         // 按key分組.window(TumblingEventTimeWindows.of(Time.seconds(10)))  // 窗口.sum("count");                      // 聚合算子
counts.addSink(new FlinkKafkaProducer<>(...));

這段用戶代碼經過Flink內部轉換,最終形成ExecutionGraph:

JobGraph (邏輯計劃)↓
ExecutionGraph (物理執行計劃)↓
實際運行的Task和SubTask

ExecutionGraph的關鍵特征

  1. 包含并行度信息:每個算子應該啟動多少個并行實例
  2. 包含資源分配:每個并行實例需要多少資源
  3. 包含數據流向:數據如何在各個并行實例之間流轉
  4. 包含容錯信息:如何進行checkpoint和故障恢復

Task:工廠中的生產線

Task的概念

Task可以理解為工廠中的一條完整生產線。由于算子鏈(Operator Chain)的優化,多個相鄰的算子會被合并到同一個Task中執行。

// 原始算子鏈
Source -> FlatMap -> Map -> KeyBy -> Window -> Sum -> Sink// 經過算子鏈優化后,可能形成這樣的Task:
Task1: Source -> FlatMap -> Map  (算子鏈合并)
Task2: KeyBy -> Window -> Sum    (算子鏈合并)  
Task3: Sink

為什么要有算子鏈?

就像工廠為了提高效率,會把相關的工序安排在同一條生產線上,避免半成品在不同車間之間頻繁搬運。

算子鏈的好處:

  • 減少數據序列化/反序列化開銷
  • 減少網絡傳輸
  • 減少線程切換
  • 提高整體處理效率

Task的實際示例

public class ChainedMapTask extends StreamTask<String, StreamMap<String, String>> {@Overrideprotected void init() {// 初始化算子鏈中的所有算子SourceFunction sourceOperator = ...;MapFunction mapOperator = ...;// 構建算子鏈}@Overrideprotected void processInput() {// 處理輸入數據,在算子鏈中依次執行while (isRunning()) {Record record = sourceOperator.next();Record mapped = mapOperator.map(record);output.collect(mapped);}}
}

SubTask:生產線上的具體工位

SubTask的概念

如果Task是一條生產線,那么SubTask就是這條生產線上的具體工位。當我們設置并行度為4時,一個Task會被分解為4個SubTask,就像一條生產線復制了4份,同時工作。

// 設置并行度
source.flatMap(new Tokenizer()).setParallelism(4);  // 創建4個SubTask// 在TaskManager中的實際執行
SubTask-0: 處理數據分區0
SubTask-1: 處理數據分區1  
SubTask-2: 處理數據分區2
SubTask-3: 處理數據分區3

SubTask的生命周期

public class SubTask {// 1. 初始化階段public void initialize() {setupOperators();initializeState();registerMetrics();}// 2. 運行階段  public void run() {while (isRunning()) {processNextRecord();if (shouldCheckpoint()) {performCheckpoint();}}}// 3. 清理階段public void cleanup() {closeOperators();releaseResources();}
}

SubTask之間的數據交換

SubTask之間通過數據分區網絡傳輸進行協作:

// KeyBy操作會觸發數據重分布
stream.keyBy(record -> record.getUserId())  // 按用戶ID分區.map(new UserProcessor());// 數據流轉示意:
SubTask-0: 用戶1,5,9...  →  重分區  →  SubTask-0: 所有用戶1的數據
SubTask-1: 用戶2,6,10... →  重分區  →  SubTask-1: 所有用戶2的數據  
SubTask-2: 用戶3,7,11... →  重分區  →  SubTask-2: 所有用戶3的數據
SubTask-3: 用戶4,8,12... →  重分區  →  SubTask-3: 所有用戶4的數據

三者關系總結

讓我們用一個完整的示例來理解三者關系:

// 1. 用戶程序
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();DataStream<String> lines = env.socketTextStream("localhost", 9999);
DataStream<Tuple2<String, Integer>> counts = lines.flatMap(new Tokenizer())                    // 并行度4.keyBy(value -> value.f0).timeWindow(Time.seconds(5)).sum(1);                                     // 并行度4counts.print();                                  // 并行度1

轉換過程:

1. ExecutionGraph層面:

ExecutionVertex-1: Source+FlatMap (并行度4)
ExecutionVertex-2: KeyBy+Window+Sum (并行度4)  
ExecutionVertex-3: Print (并行度1)

2. Task層面:

Task-1: [Source -> FlatMap] 算子鏈
Task-2: [KeyBy -> Window -> Sum] 算子鏈
Task-3: [Print]

3. SubTask層面:

Task-1的SubTask實例:- SubTask-1-0 (處理數據分片0)- SubTask-1-1 (處理數據分片1)  - SubTask-1-2 (處理數據分片2)- SubTask-1-3 (處理數據分片3)Task-2的SubTask實例:- SubTask-2-0 (處理特定key的數據)- SubTask-2-1 (處理特定key的數據)- SubTask-2-2 (處理特定key的數據)  - SubTask-2-3 (處理特定key的數據)Task-3的SubTask實例:- SubTask-3-0 (匯總所有結果)

性能調優要點

理解了這三者關系后,我們就能更好地進行性能調優:

1. 合理設置并行度

// 根據數據量和CPU核數設置
env.setParallelism(Runtime.getRuntime().availableProcessors());// 為不同算子設置不同并行度
source.setParallelism(2);     // IO密集型,并行度可以適當小些
transform.setParallelism(8);  // 計算密集型,并行度可以大些
sink.setParallelism(1);       // 輸出匯總,通常并行度為1

2. 優化算子鏈

// 禁用算子鏈(在需要時)
someStream.map(new MyMapper()).disableChaining()      // 禁用與下游算子的鏈接.keyBy(...).startNewChain()        // 從這里開始新的算子鏈.sum(1);

3. 監控SubTask運行狀況

// 通過Flink Web UI觀察:
// - 各個SubTask的吞吐量是否均衡
// - 是否存在數據傾斜
// - 網絡傳輸是否成為瓶頸
// - SubTask的CPU和內存使用情況

小結

  • ExecutionGraph:整個作業的執行藍圖,包含所有執行細節
  • Task:經過算子鏈優化的執行單元,是邏輯上的"工作組"
  • SubTask:Task的并行實例,是實際執行計算的"工人"

三者關系就像建筑施工:ExecutionGraph是施工總圖紙,Task是各個專業工種組(如水電組、瓦工組),SubTask是每個工種組里的具體工人。理解這個關系有助于我們更好地設計和優化Flink應用程序。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/94486.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/94486.shtml
英文地址,請注明出處:http://en.pswp.cn/web/94486.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

`mysql_query()` 數據庫查詢函數

1) 函數的概念與用途 mysql_query() 是 MySQL C API 中的核心函數&#xff0c;用于向 MySQL 服務器發送 SQL 查詢語句。這個函數充當了 C/C 應用程序與 MySQL 數據庫之間的橋梁&#xff0c;允許程序執行各種數據庫操作。 可以將 mysql_query() 想象成一個"數據庫信使"…

[系統架構設計師]通信系統架構設計理論與實踐(十七)

[系統架構設計師]通信系統架構設計理論與實踐&#xff08;十七&#xff09; 一.通信系統網絡架構 形式: 局域網&#xff0c;廣域網&#xff0c;移動通信網 1.局域網網絡架構 單一機構專用計算機的網絡 組成&#xff1a;計算機&#xff0c;交換機&#xff0c;路由器 特點&#x…

【趙渝強老師】Docker的私有鏡像倉庫:Harbor

Harbor是由VMware公司開發并開源的企業級的Docker鏡像倉庫的管理項目&#xff0c;它包括鏡像的權限管理&#xff08;RBAC&#xff09;、目錄訪問&#xff08;LDAP&#xff09;、日志審核、管理界面、自我注冊、鏡像復制和中文支持等功能。 視頻講解如下 【趙渝強老師】Docker的…

【QT/C++】實例理解類間的六大關系之泛化關系(Generalization)

【QT/C】實例理解類間的六大關系之泛化關系&#xff08;Generalization&#xff09; 在前面章節一文完美概括UML類圖及其符號&#xff08;超詳細介紹&#xff09;中已經對泛化關系的概念進行了總結&#xff0c;本文我將用實際案例來進一步理解泛化關系&#xff0c;以便應對未來…

【微服務的數據一致性分發問題】究極解決方案

文章目錄一、微服務數據分發1、簡介2、典型場景&#xff08;1&#xff09;跨服務業務流程協同&#xff08;2&#xff09;數據副本同步&#xff08;讀寫分離&#xff09;&#xff08;3&#xff09;實時狀態通知&#xff08;4&#xff09;數據聚合與統計分析&#xff08;5&#x…

挖幣與區塊鏈技術有怎樣的聯系?

挖幣&#xff08;通常指加密貨幣挖礦&#xff09;與區塊鏈技術有著緊密的聯系&#xff0c;挖礦是區塊鏈網絡維持運行和安全的重要機制之一&#xff0c;具體聯系如下&#xff1a;1. 挖礦是區塊鏈共識機制的核心環節區塊鏈通過“共識機制”確保全網節點對交易記錄達成一致&#x…

C數據結構:二叉樹(下)

C數據結構&#xff1a;二叉樹&#xff08;下&#xff09; 1.二叉樹遞歸結構遍歷 2.例題 3.二叉樹的性質 1.二叉樹遞歸結構遍歷 我們先創建一個如下圖所示的二叉樹。typedef int BTDataType; typedef struct BinaryTreeNode {BTDataType data;struct BinaryTreeNode* left;struc…

Linux系統的網絡管理(一)

一、網絡參數配置&#xff1a;搭建穩定網絡基礎網絡參數配置是 Linux 網絡管理的起點&#xff0c;根據操作方式可分為圖形化配置、命令行配置和配置文件配置&#xff0c;不同方式適用于不同場景&#xff08;臨時調試 / 永久生效&#xff09;。1. 圖形化配置&#xff1a;依賴 Ne…

Web程序設計

一、控件基礎 文本框、按鈕事件的使用 <% Page Language"C#" AutoEventWireup"true" CodeFile"User_Login.aspx.cs" Inherits"User_Login" %><!DOCTYPE html><html xmlns"http://www.w3.org/1999/xhtml"&g…

復合設計模式

復合設計模式復合設計模式是一種結構模式&#xff0c;可讓您統一處理單個對象和對象的組合。它允許您構建樹狀結構&#xff08;例如&#xff0c;文件系統、UI 層次結構、組織結構&#xff09;&#xff0c;客戶端可以使用同一界面處理單個元素和元素組。它在以下情況下特別有用&…

使用 Prometheus 監控服務器節點:Node Exporter 詳解與配置

前言 在上一篇文章中&#xff0c;我們介紹了如何在 CentOS 上部署 Prometheus 并使用 systemd 進行管理。本文將繼續深入&#xff0c;講解如何使用 Prometheus 監控服務器節點&#xff0c;重點介紹 Node Exporter 的作用、安裝和配置方法。 Node Exporter 是 Prometheus 生態…

C# 編寫一個XmlToDota的轉換工具

以下代碼可以將Labelme標注的旋轉框Xml格式文件轉換為Yolo標注格式的txt文件&#xff0c;以便用Yolo OBB訓練自己的數據集&#xff1a;using System; using System.Collections.Generic; using System.IO; using System.Xml; using System.Linq; using System.Globalization;na…

[Android] 人體細胞模擬器1.5

[Android] 人體細胞模擬器1.5 鏈接&#xff1a;https://pan.xunlei.com/s/VOYVUieTpjNVJq-bMys4EEDGA1?pwdm7m6# 省流:這個軟件的開發者有點逆天&#xff0c;一個模擬人體器官的軟件&#xff0c;細致到有血液報告&#xff0c;還縫合了生理學和病理學&#xff0c;甚至還能做切…

【Linux基礎知識系列】第一百一十篇 - 使用Nmap進行網絡安全掃描

在網絡安全管理中&#xff0c;了解網絡中的設備、開放的端口以及運行的服務是至關重要的。Nmap&#xff08;Network Mapper&#xff09;是一個功能強大的開源工具&#xff0c;用于網絡發現和安全審計。它可以掃描網絡中的設備&#xff0c;識別開放的端口和運行的服務&#xff0…

【Linux倉庫】進程的“奪舍”與“飛升”:exec 驅動的應用現代化部署流水線

&#x1f31f; 各位看官好&#xff0c;我是egoist2023&#xff01; &#x1f30d; Linux Linux is not Unix &#xff01; &#x1f680; 今天來學習exec系列的進程程序替換,從"fork"的"克隆"到"exec"的"重生"。 &#x1f44d; 如果覺…

Reachability Query

題目分析 該代碼實現了一個動態集合管理系統&#xff0c;支持三種操作&#xff1a;合并集合、切換元素狀態、查詢集合中是否- 存在活躍元素。核心數據結構為并查集&#xff0c;結合狀態標記數組和計數器。關鍵數據結構與函數 初始化 fa[N]&#xff1a;并查集父節點數組&#xf…

SSL移動接入方案和移動資源發布

一、SSL VPN概述SSL VPN是一種基于SSL/TLS協議的遠程安全接入技術&#xff0c;因其廣泛兼容Web瀏覽器&#xff0c;支持“無客戶端”部署&#xff0c;具備易于使用和維護的特點。它通過插件系統支持非Web類TCP/UDP應用&#xff0c;并且支持對用戶的訪問可以做出限制&#xff0c;…

C++STL---count() 統計容器中特定元素出現次數

在 C 標準庫中&#xff0c;count 是一個用于統計容器中特定元素出現次數的函數&#xff0c;定義在 <algorithm> 頭文件中。它可以快速計算某個值在容器&#xff08;如數組、vector、list 等&#xff09;中出現的次數&#xff0c;避免手動編寫循環計數的麻煩。 一、函數原…

Tesla自動駕駛域控制器(AutoPilot HW)的系統化梳理

目前網絡上對Tesla自動駕駛硬件&#xff08;AP1-AP4、HW1.0-HW4.0&#xff09;迭代的相關介紹比較混亂&#xff0c;本文這里進行系統化梳理并澄清&#xff0c;并對一些錯誤進行更正。1、AutoPilot HW迭代圖圖1 AutoPilot HWMCU迭代圖圖2 AutoPilot HW 散熱設計迭代圖&#xff0…

C 語言:第 20 天筆記:typedef(類型重命名規則、應用場景與實戰案例)

C語言&#xff1a;第20天筆記 內容提要 構造類型枚舉類型typedef綜合案例:斗地主預處理 構造類型&#xff1a;枚舉類型 使用建議 如果定義不相干的常量&#xff0c;使用宏定義&#xff08;符號常量&#xff09;&#xff1b;如果需要定義一組相關聯的常量&#xff08;如月份011、…