当前位置: 首页 > news >正文

[flink 实时流基础系列]揭开flink的什么面纱基础一

Apache Flink 是一个框架和分布式处理引擎,用于在无边界和有边界数据流上进行有状态的计算。Flink 能在所有常见集群环境中运行,并能以内存速度和任意规模进行计算。


文章目录

    • 0. 处理无界和有界数据
        • 无界流
        • 有界流
    • 1. Flink程序和数据流图
    • 2. 为什么一定要用算子的形式来写程序呢?
    • 3. 从逻辑视图转化为物理执行图
    • 4. 数据交换策略
    • 5. Flink分布式架构与核心组件
        • 1. Flink作业提交过程
    • 6. Flink核心组件
      • 1. Client
      • 2. Dispatcher
      • 3. JobManager
      • 4. ResourceManager
      • 5.TaskManager

0. 处理无界和有界数据

任何类型的数据都可以形成一种事件流。信用卡交易、传感器测量、机器日志、网站或移动应用程序上的用户交互记录,所有这些数据都形成一种流。
数据可以被作为 无界 或者 有界 流来处理。

无界流

有定义流的开始,但没有定义流的结束。它们会无休止地产生数据。无界流的数据必须持续处理,即数据被摄取后需要立刻处理。我们不能等到所有数据都到达再处理,因为输入是无限的,在任何时候输入都不会完成。处理无界数据通常要求以特定顺序摄取事件,例如事件发生的顺序,以便能够推断结果的完整性。

有界流

有定义流的开始,也有定义流的结束。有界流可以在摄取所有数据后再进行计算。有界流所有数据可以被排序,所以并不需要有序摄取。有界流处理通常被称为批处理

image.png
Apache Flink 擅长处理无界和有界数据集 精确的时间控制和状态化使得 Flink 的运行时(runtime)能够运行任何处理无界流的应用。有界流则由一些专为固定大小数据集特殊设计的算法和数据结构进行内部处理,产生了出色的性能。

1. Flink程序和数据流图

如图所示,Flink程序分为三大部分,第1部分读取数据源(Source),第2部分对数据做转换操作(Transformation),第3部分将转换结果输出到一个目的地(Sink)。
image.png
代码中 sum()、flatMap()、keyBy()、timeWindow() 这些方法,是Flink提供给程序员的接口,程序员需要调用并实现这些函数,对数据进行操作,进而变成特定的业务逻辑。
通常一到多个函数会组成一个算子(Operator)、算子执行对数据的操作(Operation)。在WordCount的例子中,有以下3类算子。
Source 算子读取数据源中的数据,数据源可以是数据流,也可以存储在文件系统中的文件。
Transformation 算子对数据进行必要的计算处理。
Sink 算子将处理结果输出,数据一般被输出到数据库、文件系统或消息队列。
:::info
我们先对这个程序中各个函数做一个简单的介绍,关于这些函数的具体使用方式将在后文中详细说明。
:::
(1)flatMap() 对输入进行处理,生成零到多个输出。本例中它执行一个简单的分词过程,对一行字符串按照空格切分,生成一个(word,1)的Key-Value二元组。
(2) keyBy() 根据某个Key对数据重新分组。本例中是将二元组(word,1)中第一项作为Key进行分组,相同的单词会被分到同一组。
(3)timeWindow() 是时间窗口函数,用来界定对多长时间之内的数据做统计。
(4)sum() 为求和函数。sum(1)表示对二元组中第二个元素求和,因为经过前面的keyBy()算子将所有相同的单词都分到了一组,因此,在这个分组内,将单词出现的次数相加,就得到出现的总次数。
:::info
在程序实际执行前,Flink会将用户编写的代码做一个简单处理,生成一个如图所示的逻辑视图。
image.png
:::
上图展示了WordCount程序中,数据在不同算子间流动的情况。
图中,圆圈代表算子,圆圈间的空心箭头代表数据流,数据流在Flink程序中经过不同算子的计算,最终生成结果。
其中,keyBy()timeWindow()sum() 共同组成了一个时间窗口上的聚合操作,被归结为一个算子 Window Aggregation。我们可以在Flink的WebUI中,单击一个作业,查看这个作业的逻辑视图。
对于WordCount程序,逻辑上来讲无非是对数据流中的单词做提取,然后使用一个Key-Value二元组对单词做词频计数,最后输出结果即可。这样的逻辑本可以用几行代码完成,改成使用算子形式,反而让人看得一头雾水。

2. 为什么一定要用算子的形式来写程序呢?

实际上,算子进化成当前这个形态,就像人类从石块计数,到手指计数、算盘计数,再到计算机计数这样的进化过程一样,尽管更低级的方式可以完成一定的计算任务,但是随着计算规模的增长,古老的计数方式存在着低效的弊端,无法完成更高级别和更大规模的计算需求。
试想,如果我们不使用大数据处理框架提供的算子,而是自己实现一套上述的计算逻辑,尽管我们可以快速完成当前的词频统计的任务,但是当面临一个新计算任务时,我们需要重新编写程序,完成一整套计算任务。我们自己编写代码的横向扩展性可能很差,当输入数据暴增时,我们需要做很大改动,以部署在更多节点上。
:::info
大数据框架的算子对计算做了一些抽象,对于人们来说有一定学习成本,而一旦掌握这门技术,人们所能处理的数据规模将成倍增加。
:::
算子的出现,正是针对大数据场景下,人们需要一种统一的计算描述语言来对数据做计算而进化出的新计算形态。基于Flink的算子,我们可以定义一个数据流的逻辑视图,以此完成对大数据的计算。剩下那些数据交换、横向扩展、故障恢复等问题可交由大数据框架来解决。

3. 从逻辑视图转化为物理执行图

在绝大多数的大数据处理场景下,一个节点无法处理所有数据,数据会被切分到多个节点上。在大数据领域,当数据量大到超过单个节点处理能力时,需要将一份数据切分到多个分区(Partition)上,每个分区分布在一台虚拟机或物理机上。
大数据框架的算子提供了编程接口,我们可以使用算子构建数据流的逻辑视图。考虑到数据分布在多个节点的情况,逻辑视图只是一种抽象,需要将逻辑视图转化为物理执行图,才能在分布式环境下执行。
image.png
如图所示为 WordCount 程序的物理执行图,数据流分布在2个分区上。空心箭头部分表示数据流分区,圆圈部分表示算子在分区上的算子子任务(Operator Subtask)。从逻辑视图变为物理执行图后,FlatMap 算子在每个分区都有一个算子子任务,以处理该分区上的数据:FlatMap[1/2] 算子子任务处理第一个数据流分区上的数据,以此类推。
在分布式计算环境下,执行计算的单个节点(物理机或虚拟机)被称为实例,一个算子在并行执行时,算子子任务会分布到多个节点上,所以算子子任务又被称为算子实例(Instance)。即使输入数据增多,我们也可以通过部署更多的算子子任务来进行横向扩展。从图中可以看到,除去 Sink 外的算子都被分成了2个算子子任务,它们的并行度(Parallelism)为2, Sink 算子的并行度为1。并行度是可以被设置的,当设置某个算子的并行度为2时,也就意味着这个算子有2个算子子任务(或者说2个算子实例)并行执行。实际应用中一般根据输入数据量的大小、计算资源的多少等多方面的因素来设置并行度。

4. 数据交换策略

如上图中出现了数据流动的现象,即数据在不同的算子子任务上进行数据交换。无论是Hadoop、Spark还是Flink,都会涉及数据交换策略。常见的数据交换策略有4种,如下图所示。
image.png

  • 前向传播(Forward):前一个算子子任务将数据直接传递给后一个算子子任务,数据不存在跨分区的交换,也避免了因数据交换产生的各类开销,前面 wordCount 中 Source 和 FlatMap 之间就是这样的情形。
  • 按Key分组(Key-Based):数据以 (Key,Value) 二元组形式存在,该策略将所有数据按照Key进行分组,相同Key的数据会被分到一组、发送到同一个分区上。WordCount程序中,keyBy() 将单词作为Key,把相同单词都发送到同一分区,以方便后续算子的聚合统计。
  • 广播(Broadcast):将某份数据发送到所有分区上,这种策略涉及了数据在全局的复制,因此非常消耗资源。
  • 随机(Random):该策略将所有数据随机均匀地发送到多个分区上,以保证数据平均分配到不同分区上。该策略通常为了防止数据倾斜到某些分区,导致部分分区数据稀疏,另外一些分区数据拥堵的情况发生。

5. Flink分布式架构与核心组件

:::info
为了支持分布式执行,Flink跟其他大数据框架一样,采用了主从(Master-Worker)架构。
:::
Flink执行时主要包括如下两个组件。

  • Master 是一个 Flink 作业的主进程。它起到了协调管理的作用。
  • TaskManager,又被称为Worker或Slave,是执行计算任务的进程。它拥有CPU、内存等计算资源。Flink作业需要将计算任务分发到多个TaskManager上并行执行。下面将从作业执行层面来分析Flink各个模块如何工作。
1. Flink作业提交过程

Flink为适应不同的基础环境(Standalone集群、YARN、Kubernetes),在不断迭代开发过程中已经逐渐形成了一个兼容性很强的架构。不同的基础环境对计算资源的管理方式略有不同,不过都大同小异,图所示为以Standalone集群为例,分析作业的提交过程。Standalone模式指Flink独占该集群,集群上无其他任务。
image.png
在一个作业提交前,Master和TaskManager等进程需要先被启动。我们可以在Flink主目录中执行脚本来启动这些进程:bin/start-cluster.sh。Master和TaskManager被启动后,TaskManager 需要将自己注册给 Master 中的 ResourceManager。这个初始化和资源注册过程发生在单个作业提交前,我们称之为第0步。
① 用户编写应用程序代码,并通过Flink客户端(Client)提交作业。程序一般为Java或Scala语言,调用Flink API,构建逻辑视图。代码和相关配置文件被编译打包,被提交到Master的Dispatcher,形成一个应用作业(Application)。
② Dispatcher接收到这个作业,启动JobManager,这个JobManager会负责本次作业的各项协调工作。
③ JobManager向ResourceManager申请本次作业所需资源。
④ 由于在第0步中TaskManager已经向ResourceManager中注册了资源,这时闲置的TaskManager会被反馈给JobManager。
⑤ JobManager将用户作业中的逻辑视图转化为并行化的物理执行图,将计算任务分发部署到多个TaskManager上。至此,一个Flink作业就开始执行了。

TaskManager在执行计算任务过程中可能会与其他TaskManager交换数据,会使用一些数据交换策略。同时,TaskManager也会将一些任务状态信息反馈给JobManager,这些信息包括任务启动、执行或终止的状态,快照的元数据等。

6. Flink核心组件

有了这个作业提交流程,读者对各组件的功能应该有了更全面的认识,接下来我们再对涉及的各个组件进行更为详细的介绍。

1. Client

用户一般使用Client提交作业,比如Flink主目录下bin目录中提供的命令行工具。Client会对用户提交的Flink作业进行预处理,并把作业提交到Flink集群上。Client提交作业时需要配置一些必要的参数,比如使用Standalone集群还是YARN集群等。整个作业被打成了JAR包,DataStream API被转换成了JobGraph,JobGraph是一种逻辑视图。

2. Dispatcher

Dispatcher可以接收多个作业,每接收一个作业,Dispatcher都会为这个作业分配一个JobManager。Dispatcher对外提供 restful 接口,以 http 来对外提供服务。

3. JobManager

:::info
JobManager 是单个Flink作业的协调者,一个作业会有一个JobManager来负责。
:::
JobManager会将Client提交的JobGraph转化为ExecutionGraph,ExecutionGraph是并行的物理执行图。JobManager会向ResourceManager申请必要的资源,当获取足够的资源后,JobManager将ExecutionGraph以及具体的计算任务分发部署到多个TaskManager上。同时,JobManager还负责管理多个TaskManager,包括收集作业的状态信息、生成检查点、必要时进行故障恢复等。
早期,Flink Master被命名为JobManager,负责绝大多数Master进程的工作。随着迭代和开发,出现了名为JobMaster的组件,JobMaster负责单个作业的执行。本书中,我们仍然使用JobManager的概念,表示负责单个作业的组件。一些Flink文档也可能使用JobMaster的概念,读者可以将JobMaster等同于JobManager来看待。

4. ResourceManager

Flink现在可以部署在 Standalone、YARN或Kubernetes 等环境上,不同环境中对计算资源的管理模式略有不同,Flink使用一个名为 ResourceManager 的模块来统一处理资源分配上的问题。
:::info
在Flink中,计算资源的基本单位是TaskManager上的任务槽位(Task Slot,简称Slot)。
:::
ResourceManager 的职责主要是从YARN等资源提供方获取计算资源,当JobManager有计算需求时,将空闲的Slot分配给JobManager。当计算任务结束时,ResourceManager 还会重新收回这些Slot。

5.TaskManager

TaskManager 是实际负责执行计算的节点。一般地,一个Flink作业是分布在多个TaskManager上执行的,单个TaskManager上提供一定量的Slot。一个 TaskManager 启动后,相关Slot信息会被注册到 ResourceManager 中。当某个Flink作业提交后,ResourceManager 会将空闲的Slot提供给 JobManagerJobManager 获取到空闲的 Slot 后会将具体的计算任务部署到空闲 Slot 之上,任务开始在这些 Slot 上执行。在执行过程,由于要进行数据交换,TaskManager 还要和其他 TaskManager 进行必要的数据通信。
:::info
总之,TaskManager 负责具体计算任务的执行,启动时它会将 Slot 资源向 ResourceManager 注册。
:::

相关文章:

[flink 实时流基础系列]揭开flink的什么面纱基础一

Apache Flink 是一个框架和分布式处理引擎,用于在无边界和有边界数据流上进行有状态的计算。Flink 能在所有常见集群环境中运行,并能以内存速度和任意规模进行计算。 文章目录 0. 处理无界和有界数据无界流有界流 1. Flink程序和数据流图2. 为什么一定要…...

开放平台 - 互动玩法演进之路

本期作者 1. 背景 随着直播业务和用户规模日益壮大,如何丰富直播间内容、增强直播间内用户互动效果,提升营收数据变得更加关键。为此,直播互动玩法应运而生。通过弹幕、礼物、点赞、大航海等方式,用户可以参与主播的直播内容。B站…...

Linux之进程控制进程终止进程等待进程的程序替换替换函数实现简易shell

文章目录 一、进程创建1.1 fork的使用 二、进程终止2.1 终止是在做什么?2.2 终止的3种情况&&退出码的理解2.3 进程常见退出方法 三、进程等待3.1 为什么要进行进程等待?3.2 取子进程退出信息status3.3 宏WIFEXITED和WEXITSTATUS(获取…...

RegSeg 学习笔记(待完善)

论文阅读 解决的问题 引用别的论文的内容 可以用 controlf 寻找想要的内容 PPM 空间金字塔池化改进 SPP / SPPF / SimSPPF / ASPP / RFB / SPPCSPC / SPPFCSPC / SPPELAN  ASPP STDC:short-term dense concatenate module 和 DDRNet SE-ResNeXt …...

Qt中常用宏定义

Qt中常用宏定义 一、Q_DECLARE_PRIVATE(Class)二、Q_DECLARE_PRIVATE_D(Dptr, Class)三、Q_DECLARE_PUBLIC(Class)四、Q_D(Class) 和 Q_Q(Class) 一、Q_DECLARE_PRIVATE(Class) #define Q_DECLARE_PRIVATE(Class) inline Class##Private* d_func() { # 此处的 d_ptr 是属于QOb…...

【计算机网络】第 9 问:四种信道划分介质访问控制?

目录 正文什么是信道划分介质访问控制?什么是多路复用技术?四种信道划分介质访问控制1. 频分多路复用 FDM2. 时分多路复用 TDM3. 波分多路复用 WDM4. 码分多路复用 CDM 正文 什么是信道划分介质访问控制? 信道划分介质访问控制(…...

Rust编程(五)终章:查漏补缺

闭包 & 迭代器 闭包(Closure)通常是指词法闭包,是一个持有外部环境变量的函数。外部环境是指闭包定义时所在的词法作用域。外部环境变量,在函数式编程范式中也被称为自由变量,是指并不是在闭包内定义的变量。将自…...

LLM漫谈(五)| 从q star视角解密OpenAI 2027年实现AGI计划

最近,网上疯传OpenAI2027年关于AGI的计划。在本文,我们将针对部分细节以第一人称进行分享。​ 摘要:OpenAI于2022年8月开始训练一个125万亿参数的多模态模型。第一个阶段是Arrakis,也叫Q*,该模型于2023年12月完成训练&…...

【echart】数据可视化+vue+vite遇到问题

1、vue3使用echars图表报错:"Initialize failed:invalid dom" 原因是因为:Dom没有完成加载时,echarts.init() 就已经开始执行了,获取不到Dom,无法进行操作 解决:加个延时 onMounted(async () …...

mac m1安装和使用nvm的问题

mac m1安装和使用nvm的问题 使用nvm管理多版本node 每个项目可能用的node版本不同,所以需要多个版本node来回切换 但是最近遇到安装v14.19.0时一直安装失败的问题。 首先说明一下,用的电脑是mac M1芯片 Downloading and installing node v14.19.0... …...

git泄露

git泄露 CTFHub技能树-Web-信息泄露-备份文件下载 当前大量开发人员使用git进行版本控制,对站点自动部署。如果配置不当,可能会将.git文件夹直接部署到线上环境。这就引起了git泄露漏洞。 工具GitHack使用:python2 GitHack.py URL地址/.git/ git命令…...

Java项目:78 springboot学生宿舍管理系统的设计与开发

作者主页:源码空间codegym 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 系统的角色:管理员、宿管、学生 管理员管理宿管员,管理学生,修改密码,维护个人信息。 宿管员…...

ArcGis Pro Python工具箱教程 03 工具箱中工具自定义

ArcGis Pro Python工具箱教程 03 工具箱中工具自定义 用于定义工作工具类的方法 工具方法必选或可选描述__ init __必需项right-aligned 初始化工具类。getParameterInfo可选定义工具的参数。isLicensed可选返回工具是否获得执行许可。updateParameters可选在用户每次在工具对…...

【C++初阶】之类和对象(中)

【C初阶】之类和对象(中) ✍ 类的六个默认成员函数✍ 构造函数🏄 为什么需要构造函数🏄 默认构造函数🏄 为什么编译器能自动调用默认构造函数🏄 自己写的构造函数🏄 构造函数的特性 ✍ 拷贝构造…...

Vue2(十一):脚手架配置代理、github案例、插槽

一、脚手架配置代理 1.回顾常用的ajax发送方式: (1)xhr 比较麻烦,不常用 (2)jQuery 核心是封装dom操作,所以也不常用 (3)axios 优势:体积小、是promis…...

在宝塔面板中,为自己的云服务器安装SSL证书,为所搭建的网站启用https(主要部分攻略)

前提条件 My HTTP website is running Nginx on Debian 10(或者11) 时间:2024-3-28 16:25:52 你的网站部署在Debain 10(或者11)的 Nginx上 安装单域名证书(默认)(非泛域名&#xf…...

学习JavaEE的日子 Day32 线程池

Day32 线程池 1.引入 一个线程完成一项任务所需时间为: 创建线程时间 - Time1线程中执行任务的时间 - Time2销毁线程时间 - Time3 2.为什么需要线程池(重要) 线程池技术正是关注如何缩短或调整Time1和Time3的时间,从而提高程序的性能。项目中可以把Time…...

@Transactional 注解使用的注意事项

事务管理 事务管理在系统开发中是不可缺少的一部分,Spring提供了很好的事务管理机制,主要分为编程式事务和声明式事务两种。 编程式事务: 是指在代码中手动的管理事务的提交、回滚等操作,代码侵入比较强。 声明式事务&#xff…...

电商系列之库存

> 插:AI时代,程序员或多或少要了解些人工智能,前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 坚持不懈,越努力越幸运,大家…...

Apache HBase(二)

目录 一、Apache HBase 1、HBase Shell操作 1.1、DDL创建修改表格 1、创建命名空间和表格 2、查看表格 3、修改表 4、删除表 1.2、DML写入读取数据 1、写入数据 2、读取数据 3、删除数据 2、大数据软件启动 一、Apache HBase 1、HBase Shell操作 先启动HBase。再…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

【2025年】解决Burpsuite抓不到https包的问题

环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

SpringTask-03.入门案例

一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...

Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成

一个面向 Java 开发者的 Sring-Ai 示例工程项目&#xff0c;该项目是一个 Spring AI 快速入门的样例工程项目&#xff0c;旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计&#xff0c;每个模块都专注于特定的功能领域&#xff0c;便于学习和…...