【大数据】Flink 架构(二):数据传输

news2024/11/18 9:33:21

Flink 架构》系列(已完结),共包含以下 6 篇文章:

  • Flink 架构(一):系统架构
  • Flink 架构(二):数据传输
  • Flink 架构(三):事件时间处理
  • Flink 架构(四):状态管理
  • Flink 架构(五):检查点 Checkpoint(看完即懂)
  • Flink 架构(六):保存点 Savepoint

😊 如果您觉得这篇文章有用 ✔️ 的话,请给博主一个一键三连 🚀🚀🚀 吧 (点赞 🧡、关注 💛、收藏 💚)!!!您的支持 💖💖💖 将激励 🔥 博主输出更多优质内容!!!

Flink 架构(二):数据传输

  • 1.基于信用值的流量控制
  • 2.任务链接

在运行过程中,应用的任务会持续进行数据交换。TaskManager 负责将数据从发送任务传输至接收任务。它的网络模块在记录传输前会先将它们收集到 缓冲区 中。换言之,记录并非逐个发送的,而是在缓冲区中以批次形式发送。该技术是有效利用网络资源、实现高吞吐的基础。它的机制类似于网络以及磁盘 I/O 协议中的缓冲技术。

❗ 请注意,将记录放入缓冲区并不意味着 Flink 的处理模型是基于微批次的。

每个 TaskManager 都有一个用于收发数据的网络缓冲池(每个缓冲默认 32 KB 大小)。如果发送端和接收端的任务运行在不同的 TaskManager 进程中,它们就要用到 操作系统的网络栈 进行通信。流式应用需要以流水线方式交换数据,因此每对 TaskManager 之间都要维护一个或多个永久的 TCP 连接来执行数据交换。 在 Shuffle 连接模式下,每个发送端任务都需要向任意一个接收任务传输数据。对于每一个接收任务,TaskManager 都要提供一个专用的网络缓冲区、用于接收其他任务发来的数据。下图展示了这一架构。

在这里插入图片描述
如上图所示,由于接收端的并行度为 4,所以每个发送端任务至少需要 4 个网络缓冲区来向任一接收端任务发送数据。同理,每个接收端任务也需要至少 4 个缓冲区来接收数据。缓冲区内的数据在向对方 TaskManager 传输时会共享网络连接。为了使流水线式的数据交换平滑进行,TaskManager 必须提供足够多的缓冲区来同时服务所有进出连接。在 Shuffle 或广播连接的情况下,每个发送任务都需要为每个接收任务提供一个缓冲区,因此所需的缓冲区数量可达到相关算子任务数的平方级别。Flink 默认的网络缓冲区配置足以应对中小型使用场景。而对于大型使用场景,后续将会介绍其内容调整配置。

批处理应用除了流水线式通信之外,还可以在发送端收集需要发出的数据。一旦发送端任务完成。所有数据会经由一个到接收端的临时 TCP 连接批量发出。

当发送任务和接收任务处于同一个 TaskManager 进程时,发送任务会将要发送的记录序列化到一个字节缓冲区中。一且该缓冲区占满就会被放到一个队列里。接收任务会从这个队列里获取缓冲区并将其中的记录反序列化。这意味着 同一个 TaskManager 内不同任务之间的数据传输不会涉及网络通信

Flink 采用多种技术来降低任务之间的通信开销。接下来,我们简要讨论一下 基于信用值credit-based)的流量控制以及 任务链接task chaining)。

1.基于信用值的流量控制

通过网络连接逐条发送记录不但低效,还会导致很多额外开销。若想充分利用网络连接带宽,就需要对数据进行缓冲。在流处理环境下,缓冲的一个明显缺点是会增加延迟,因为记录首先要收集到缓冲区中而不会立即发送。

Flink 实现了一个基于信用值的流量控制机制,它的工作原理如下:接收任务会给发送任务授予一定的信用值,其实就是保留一些用来接收它数据的网络缓冲。一旦发送端收到信用通知,就会在 信用值所限定的范围内 尽可能多地传输缓冲数据,并会附带上 积压量(已经填满准备传输的网络缓冲数目)大小。

接收端使用保留的缓冲来处理收到的数据,同时依据各 发送端的积压量信息 来计算所有相连的发送端在下一轮的信用优先级。由于发送端可以在接收端有足够资源时立即传输数据,所以基于信用值的流量控制可以有效降低延迟。此外,信用值的授予是根据各发送端的数据积压量来完成的,因此该机制还能在出现数据倾斜(data skew)时有效地分配网络资源。不难看出,基于信用值的流量控制是 Flink 实现高吞吐低延迟的重要一环。

2.任务链接

Flink 采用一种名为 任务链接 的优化技术来降低某些情况下的 本地通信开销。任务链接的前提条件是,多个算子必须有相同的并行度且通过本地转发通道(local forward channel)相连。下图中算子所组成的流水线就满足上述条件。它包含了 3 个算子,每个算子的任务并行度都为 2 且通过本地转发方式连接。

在这里插入图片描述
下图展示了流水线如何在任务链接模式下执行。多个算子的函数被 “融合” 到同一个任务中,在同一个线程内执行。函数生成的记录只需通过简单的方法调用就可以分别发往各自的下游函数。因此函数之间的记录传输基本上不存在序列化及通信开销。

在这里插入图片描述
单线程执行的链接任务 “融合” 了多个函数,并通过方法调用进行数据传输。

虽然任务链接可以有效地降低本地任务之间的通信开销,但有的流水线应用反而不希望用到它。举例而言,有时候我们需要对过长任务链接进行切分或者将两个计算量大的函数分配到不同的处理槽中。下图展示了相同的流水线在非任务链接模式下执行。其中每个函数都交由单独的任务、在特定线程内处理。

在这里插入图片描述
利用专用线程执行非链接任务并通过缓冲通道及序列化进行数据传输。

Flink 在默认情况下会开启任务链接。后续,我们会展示如何针对某一应用禁用任务链接以及如何单独控制单个算子的行为。

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

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

相关文章

(2)(2.9) Holybro Microhard P900无线电遥测设备

文章目录 前言 1 特点 2 规格 3 包装内包括 前言 Holybro Microhard Radio 集成了 microhard Pico 系列射频模块,能够在强大的拓扑结构中提供高性能无线串行通信,如点对点、点对多点和安全 Mesh(P840 不提供 Mesh)。 它采用跳…

翻译: GPT-4 Vision静态图表转换为动态数据可视化 升级Streamlit 三

GPT-4 Vision 系列: 翻译: GPT-4 with Vision 升级 Streamlit 应用程序的 7 种方式一翻译: GPT-4 with Vision 升级 Streamlit 应用程序的 7 种方式二 1. 将任何静态图表转换为动态数据可视化 ChatGPT Vision 不仅可以将涂鸦变成功能齐全的 Streamlit 应用程序,还…

关机恶搞小程序

1. system("shutdown")的介绍 当system函数的参数是"shutdown"时,它将会执行系统的关机命令。 具体来说,system("shutdown")的功能是向操作系统发送一个关机信号,请求关闭计算机。这将触发操作系统执行一系列…

Java项目:基于SSM框架实现的企业员工岗前培训管理系统(ssm+B/S架构+源码+数据库+毕业论文)

一、项目简介 本项目是一套ssm821基于ssm框架实现的企业员工岗前培训管理系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格…

w24文件上传之PHP伪协议

PHP支持的伪协议 file:// - 访问本地文件系统 http:// - 访问网址 ftp:// - 访问文件 php:// -访问各个输入/输出流 zlib:// -压缩流 data:// - 数据 glob:// -查找匹配的文件路径模式 phar:// - php归档 ssh2:// - Secure shell 2 rar:// - RAR ogg:// - 音频流 expect:// - …

【Python从入门到进阶】48、当当网Scrapy项目实战(一)

接上篇《47、Scrapy Shell的了解与应用》 上一篇我们学习了Scrapy终端命令行工具Scrapy Shell,并了解了它是如何帮助我们更好的调试爬虫程序的。本篇我们将正式开启一个Scrapy爬虫项目的实战,对当当网进行剖析和抓取。 一、当当网介绍 当当网成立于199…

字符串函数(1)

目录 大小写转换 首字母大写 计算字符串的长度 Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 字符串函数可以对字符串数据进行处理,在 Oracle 中此类函数主要有如下几种: UPPER()、LOWER()、INITCAP()、REP…

PMP五大过程组:项目成功的金钥匙

在项目管理领域,PMP(项目管理专业)一直被视为权威的标准。PMP认证的项目管理方法论,即五大过程组和十大知识领域,为项目管理提供了一套完整、系统的方法论。五大过程组作为PMP的核心,涵盖了项目从开始到结束…

bert新闻标题分类

使用 bert 完成文本分类任务,数据有 20w,来自https://github.com/649453932/Bert-Chinese-Text-Classification-Pytorch/tree/master/THUCNews 下载即可: 模型使用 bert-base-chinese 下载参考:bert预训练模型下载-CSDN博客 实现了…

无人机在三维空间中的转动问题

前提 这篇博客是对最近一个有关无人机拍摄图像项目中所学到的新知识的一个总结,比较杂乱,没有固定的写作顺序。 无人机坐标系旋转问题 上图是无人机坐标系,绕x轴是翻滚(Roll),绕y轴是俯仰(Pitch),绕z轴是偏航(Yaw)。…

微信小程序(二十三)获取页面栈及当前页面实例

注释很详细,直接上代码 上一篇 新增内容: 1.页面栈的定义 2.获取当前页面实例 页面栈 当我们从A页面跳到B页面再跳到C页面时,页面栈则是由三个页面的实例组成的数组,A在下标为0的数组中,C在下标为2的数组中 当然&#…

【JaveWeb教程】(30)SpringBootWeb案例之《智能学习辅助系统》的详细实现步骤与代码示例(3)员工管理的实现

目录 SpringBootWeb案例033. 员工管理3.1 分页查询3.1.1 基础分页3.1.1.1 需求分析3.1.1.2 接口文档3.1.1.3 思路分析3.1.1.4 功能开发3.1.1.5 功能测试3.1.1.6 前后端联调 3.1.2 分页插件3.1.2.1 介绍3.1.2.2 代码实现3.1.2.3 测试 3.2 分页查询(带条件)3.2.1 需求3.2.2 思路分…

[答疑]张学友和Neal Ford的区别

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 albert 2024-1-22 16:43 如果base合适,不出差也可以演讲。比如base北京,每周在北京讲3到4场,一年150到200,十五二十年就累积够了。 我看新闻&…

【Sql Server】新手一分钟看懂在已有表基础上增加字段和说明

欢迎来到《小5讲堂》,大家好,我是全栈小5。 这是《Sql Server》系列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对…

【时间安排】

最近刚刚回到家,到家就是会有各种事情干扰,心里变乱人变懒的,而要做的事情也要继续,写论文,改简历,学习新技能。。 明天后天两天写论文改简历 周一(早上去城市书房,可能吵一点戴个耳…

linux 下scrcpy 手机投屏到电脑,QT+ffmpeg 获取视频流,处理等等

linux 下scrcpy 手机投屏到电脑,QT+ffmpeg 获取视频流,处理 1 安装 scrcpy 地址 https://github.com/Genymobile/scrcpy 转到 relese 下载 我这里下载的是linux系统 v2.3.1 版本 scrcpy-2.3.1.tar.gz 下载 scrcpy-server v2.3.1 版本 scrcpy-server-v2.3.1 解压scrcpy-2.3…

uni-app 开发

一、uni-app 简介 uni-app 是一个使用 Vue.js 开发所有前端应用的框架 。开发者编写一套代码,可发布到 iOS 、 Android 、 H5 、以及各种小程序(微信 / 支付宝 / 百度 / 头条 /QQ/ 钉钉 / 淘宝)、快应用等多个平台。 详细的 uni-app 官方…

mysql注入联合查询

环境搭建 下载复现漏洞的包 下载小皮面板 将下载好的文件解压在小皮面板的phpstudy_pro\WWW路径下 将这个文件phpstudy_pro\WWW\sqli-labs-php7-master\sql-connections\db-creds.inc 中的密码更改为小皮面板中的密码 选择php版本 在小皮中启动nginx和数据库 使用环回地址访…

python爬虫demo——爬取历史平均房价

简单爬取历史房价 需求 爬取的网站汇聚数据的城市房价 https://fangjia.gotohui.com/ 功能 选择城市 https://fangjia.gotohui.com/fjdata-3 需要爬取年份的数据,等等 https://fangjia.gotohui.com/years/3/2018/ 使用bs4模块 使用bs4模块快速定义需要爬取的…

c#之构值类型和引用类型

值类型:(整数/bool/struct/char/小数) 引用类型:(string/ 数组 / 自定义的类 / 内置的类) 值类型只需要一段单独的内存,用于存储实际的数据 引用类型需要两段内存(第一段存储实际的数据,他总是位于 堆中第二段是一个引用,指向数据在堆中的存放位置) 当使用引用类型赋值的时…