Apache Flink技术原理深入解析:任务执行流程全景图

news2025/3/25 7:09:33

前言

本文隶属于专栏《大数据技术体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!

本专栏目录结构和参考文献请见大数据技术体系


思维导图

在这里插入图片描述

📌 引言

Apache Flink 作为一款高性能的分布式流处理引擎,其内部执行机制精妙而复杂。本文将深入剖析 Flink 从任务提交到执行的完整流程,揭示其背后的架构设计与技术原理。通过理解这一执行链路,开发者能够更有效地优化应用程序、排查问题,并充分发挥 Flink 的性能优势。

🔍 Flink 执行流程概述

Flink 的任务执行流程可概括为四个核心阶段:Client提交任务→JobGraph生成→调度与Slot分配→Task执行。这四个阶段共同构成了一个完整的任务生命周期。

在这里插入图片描述

Flink 执行图转换经过四层变换,层层优化,实现从逻辑到物理的高效映射:

在这里插入图片描述

🚀 1. 客户端提交任务

1.1 任务提交入口

当用户调用 env.execute() 方法时,整个 Flink 作业的执行流程正式启动。根据配置的运行模式不同(本地模式或远程集群模式),Flink 会创建相应的执行环境。

// 典型的Flink程序入口
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// 定义数据处理逻辑
DataStream<String> stream = env.fromSource(...)
    .map(...)
    .keyBy(...)
    .window(...)
    .reduce(...);
// 触发执行
env.execute("Job Name");

execute() 方法是整个任务提交流程的起点,它会触发以下过程:

  1. 获取执行环境(StreamExecutionEnvironmentExecutionEnvironment
  2. 生成初始执行图(StreamGraph
  3. 将执行图转换为优化后的作业图(JobGraph
  4. 将作业提交到执行环境

在这里插入图片描述

1.2 执行环境的类型与选择

Flink 提供了多种执行环境,根据不同的运行场景选择:

  • LocalStreamEnvironment:在本地 JVM 中执行,用于测试和开发
  • RemoteStreamEnvironment:连接到远程 Flink 集群执行
  • StreamContextEnvironment:CLI 提交时使用
  • StreamPlanEnvironment:用于生成执行计划但不实际执行作业

执行环境的选择直接影响后续的作业提交方式和资源分配策略。

1.3 StreamGraph 的生成机制

当用户通过 Flink API(如 map()filter()keyBy() 等)定义数据转换时,这些操作并不会立即执行,而是被注册为 Transformation 对象,形成一个转换链。

在这里插入图片描述

StreamGraph 是对用户代码逻辑的直接映射,它通过 StreamGraphGenerator 类生成:

  1. 遍历所有注册的 Transformation
  2. 为每个 Transformation 创建相应的 StreamNode
  3. 根据上下游依赖关系,创建 StreamEdge 连接各个节点
  4. 设置节点的并行度、缓冲区参数等属性
// StreamGraph生成的核心代码(简化版)
public class StreamGraphGenerator {
   
    public StreamGraph generate() {
   
        // 遍历所有Transformation并创建对应的StreamNode
        for (Transformation<?> transformation : transformations) {
   
            transform(transformation);
        }
        return streamGraph;
    }
    
    private <T> Collection<Integer> transform(Transformation<T> transform) {
   
        // 根据转换类型创建不同的节点
        if (transform instanceof OneInputTransformation) {
   
            return transformOneInputTransform((OneInputTransformation<?, T>) transform);
        } else if (...) {
   
            // 处理其他类型的转换
        }
    }
}

生成的 StreamGraph 包含以下关键信息:

  • 操作符(Operator)的类型和属性
  • 数据流的来源和去向
  • 并行度配置
  • 操作符状态描述
  • 时间特性配置(事件时间/处理时间)
  • 水位线(Watermark)策略

1.4 JobGraph 生成与优化

StreamGraph 生成后,接下来会被转换为 JobGraph,这是一个经过初步优化的执行计划。JobGraph 的核心优化包括算子链(Operator Chaining)的形成,这是 Flink 性能优化的关键技术。

在这里插入图片描述

在 JobGraph 阶段,Flink 会分析哪些操作可以链接在一起执行,从而减少数据传输和线程切换的开销。

算子链条件:
  1. 相同的并行度:链接的算子必须有相同的并行度设置
  2. 上下游单向 Forward 边:数据传输模式必须是 FORWARD(一对一)
  3. 同一个 Slot Group:所有算子必须在同一个槽位组内
  4. 下游算子的入度为 1:下游算子只能有一个输入源
  5. 上游算子的出度为 1:上游算子只能有一个输出目标
  6. 算子链接标志未禁用:开发者没有手动禁止链接
// 禁用特定算子的链接示例
DataStream<String> stream = env.fromSource(...)
    .map(...).disableChaining()  // 禁用此map操作的链接
    .filter(...)
    .keyBy(...);

1.5 提交到集群

JobGraph 生成后,Flink 会将其提交到集群执行。提交方式取决于执行环境类型:

本地模式:
  1. 启动 MiniCluster(一个轻量级的 Flink 集群)
  2. 直接将 JobGraph 提交到本地 JobManager
  3. 等待执行完成或异常
远程模式:
  1. 创建 ClusterClient(通常是 RestClusterClient)
  2. 将 JobGraph 序列化并通过 REST API 提交给 Dispatcher
  3. 上传依赖的 JAR 包和相关资源
  4. 获取 JobID 并可选择等待执行结果

在这里插入图片描述

客户端提交还包含以下关键步骤:

  • 依赖解析:确定作业所需的所有依赖 JAR 包
  • 类加载隔离:设置适当的类加载器层次结构
  • 配置传递:将作业相关的配置参数传递给集群
  • 资源需求计算:估算作业所需的资源(内存、CPU 等)

🔄 2. JobGraph 生成流程

2.1 StreamGraph 到 JobGraph 的转换

StreamGraph 到 JobGraph 的转换是在客户端完成的,这个过程由 StreamingJobGraphGenerator 类负责。转换步骤如下:

  1. 确定算子链:根据链接条件,确定哪些操作可以链接到一起
  2. 创建 JobVertex:为每个算子链创建一个 JobVertex
  3. 设置边缘属性:根据数据传输模式设置边缘属性(如分区策略)
  4. 配置检查点:设置检查点相关的配置
  5. 优化资源分配:配置 Slot 共享组和协同定位约束
// JobGraph生成的简化代码
public JobGraph createJobGraph() {
   
    // 创建空的JobGraph
    JobGraph jobGraph = new JobGraph(jobName);
    
    // 构建算子链
    Map<Integer, OperatorChain> chainedOperators = buildOperatorChains();
    
    // 为每个链创建JobVertex
    for (OperatorChain chain : chainedOperators.values()) 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2320263.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RAG(Retrieval-Augmented Generation)基建之PDF解析的“魔法”与“陷阱”

嘿&#xff0c;亲爱的算法工程师们&#xff01;今天咱们聊一聊PDF解析的那些事儿&#xff0c;简直就像是在玩一场“信息捉迷藏”游戏&#xff01;PDF文档就像是个调皮的小精灵&#xff0c;表面上看起来规规矩矩&#xff0c;但当你想要从它那里提取信息时&#xff0c;它就开始跟…

C语言【文件操作】详解中(会使用fgetc,fputc,fgets,fputs,fscanf,fprintf,fread,fwrite函数)

引言 介绍和文件操作中文件的顺序读写相关的函数 看这篇博文前&#xff0c;希望您先仔细看一下这篇博文&#xff0c;理解一下文件指针和流的概念&#xff1a;C语言【文件操作】详解上-CSDN博客文章浏览阅读606次&#xff0c;点赞26次&#xff0c;收藏4次。先整体认识一下文件是…

GpuGeek:破解算力难题,赋能AI创新与普及

文章目录 一、引言二、填补算力资源供需缺口&#xff0c;降低使用门槛三、提升算力资源利用率&#xff0c;推动高效协作四、满足多样化需求&#xff0c;支持AI技术落地五、推动算力市场创新&#xff0c;促进生态良性发展六、助力AI人才培养&#xff0c;推动行业长远发展七、结语…

扣子平台知识库不能上传成功

扣子平台知识库不能上传成功 目录 扣子平台知识库不能上传成功查看模板复制头部到自己的excel中json数据转为excel或者csv&#xff08;一定使用excel&#xff0c;csv总是报错&#xff09; 查看模板复制头部到自己的excel中 json数据转为excel或者csv&#xff08;一定使用excel&…

JVM的组成--运行时数据区

JVM的组成 1、类加载器&#xff08;ClassLoader&#xff09; 类加载器负责将字节码文件从文件系统中加载到JVM中&#xff0c;分为&#xff1a;加载、链接&#xff08;验证、准备、解析&#xff09;、和初始化三个阶段 2、运行时数据区 运行时数据区包括&#xff1a;程序计数…

c++进阶之------红黑树

一、概念 红黑树&#xff08;Red-Black Tree&#xff09;是一种自平衡二叉查找树&#xff0c;它在计算机科学的许多领域中都有广泛应用&#xff0c;比如Java中的TreeMap和C中的set/map等数据结构的底层实现。红黑树通过在每个节点上增加一个颜色属性&#xff08;红色或黑色&am…

ubuntu22.04安装搜狗输入法保姆教程~

一、添加中文语言支持 1.首先打开设置,找到Language and Region 2.点击Manage Installed Languages 3.点击 Install/Remove Languages... 4.选中Chinese (simplified),点击Apply

《数据库原理》SQLServer期末复习_题型+考点

目录 题型&#xff1a; 一. 概况分析题&#xff08;5小题&#xff0c;每小题2分&#xff0c;共10分&#xff09; 二. 计算题&#xff08;3小题&#xff0c;每小题5分&#xff0c;共15分&#xff09; 三. 数据库设计&#xff08;2小题&#xff0c;每小题10分&#xff0c;共2…

Zstd(Zstandard)压缩算法

要压缩的数据量越小&#xff0c;压缩的难度就越大。这个问题对所有压缩算法都是通用的&#xff0c;原因是压缩算法从过去的数据中学习如何压缩未来的数据。但是&#xff0c;在新数据集开始时&#xff0c;没有“过去”可以构建。 官网 为了解决这种情况&#xff0c;Zstd 提供了一…

本地部署 browser-use

本地部署 browser-use 0. 引言1. 核心功能与优势2. 快速上手3. 部署 Gradio UI4. 更多示例0. 引言 Browser-Use 是一个强大的工具,旨在让 AI Agent 能够控制浏览器,从而实现各种自动化任务。它简化了 AI 与浏览器的交互,让开发者能够轻松构建能够执行网页操作的智能应用。本…

Vite管理的Vue3项目中monaco editer的使用以及组件封装

文章目录 背景环境说明安装流程以及组件封装引入依赖封装组件 外部使用实现效果 v-model实现原理 背景 做oj系统的时候,需要使用代码编辑器,决定使用Monaco Editor&#xff0c;但是因为自身能力问题&#xff0c;读不懂官网文档&#xff0c;最终结合ai和网友的帖子成功引入&…

[笔记] TinyWebServer编译及demo运行过程

文章目录 前言环境搭建ubuntumysql 8.0c/c开启root用户TinyWebServer 搭建及编译过程运行结果常见问题./threadpool/../CGImysql/sql_connection_pool.h:6:10: fatal error: mysql/mysql.h: No such file or directory./server运行后直接退出了 前言 哎 也就帮帮新手看看问题 …

基于springboot的电影院管理系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 互联网技术的成熟和普及&#xff0c;势必会给人们的生活方式带来不同程度的改变。越来越多的经营模式中都少不了线上运营&#xff0c;互联网正强力推动着社会和经济发展。国人对民族文化的自信和不同文化的包容&#xff0c;再加上电影行业的发展&#xff0c;如此繁荣吸引…

虚拟电商-延迟任务系统的微服务改造(二)注册中心和Feign调用

一、微服务注册中心Consul 编写完延迟任务系统的web层接口&#xff0c;也就是说可以基于http协议来访问延迟系统&#xff0c;接下来要将延迟任务改造成一个服务。首要考虑的问题就是服务的注册与发现&#xff0c;服务的注册与发现都离不开服务的注册中心&#xff0c;本项目选取…

数智读书笔记系列022《算力网络-云网融合2.0时代的网络架构与关键技术》读书笔记

一、书籍核心价值与定位 1.1 书籍概述:中国联通研究院的权威之作 《算力网络 —— 云网融合 2.0 时代的网络架构与关键技术》由中国联通研究院算力网络攻关团队精心撰写,是业界首部系统性探讨云网融合 2.0 与算力网络的专著。在云网融合从 1.0 迈向 2.0 的关键节点,本书的…

第十六届蓝桥杯康复训练--6

题目链接&#xff1a;790. 数的三次方根 - AcWing题库 思路&#xff1a;二分&#xff0c;注意正负号和小数判断退出的方法&#xff08;虽然正负无所谓&#xff09; 代码&#xff1a; #include<bits/stdc.h> using namespace std;#define exs 0.00000018812716007232667…

logisim安装以及可能出现的问题

阅读提示&#xff1a;我这篇文章更偏向于安装出现问题的解决方案 目录 一、安装步骤 二、安装问题 1、出错的问题 2、出错的原因与解决方法 一、安装步骤 1、下载logisim 官方网站&#xff1a;https://sourceforge.net/projects/circuit/ 下载适用于你操作系统的版本&…

Servlet、HttpServletRequest、HttpServletResponse、静态与动态网页、jsp、重定向与转发

DAY15.2 Java核心基础 JavaWeb 要想通过浏览器或者客户端来访问java程序&#xff0c;必须通过Servlet来处理 没有Servlet&#xff0c;java是无法处理web请求的 Web交互&#xff1a; 接收请求HttpServletRequest&#xff1a;可以获取到请求的信息&#xff0c;比如uri&#…

hackmyvm-Icecream

arp-scan -l nmap -sS -v 192.168.222.106 enum4linux 192.168.222.106 445端口 smbmap -H 192.168.222.106 icecream为只读模式 smbclient \\192.168.222.106\icecream 反弹shell(上传put php-reverse-shell.php) 开启监听 nc -lnvp 1234 拿到webshell cat /etc/passwd 9000端…

告别低效人工统计!自动计算计划进度

实时监控任务进度一直是项目管理中的一项巨大挑战。 人工统计方式不仅耗时耗力&#xff0c;而且往往由于信息传递的延迟和人为误差&#xff0c;导致无法实时获得准确的项目进展信息。 这种不准确性可能掩盖潜在的风险点&#xff0c;从而影响项目的整体进度和成果。 Ganttable …