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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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、…