【Flink数据传输(一)】NetworkStack架构概述:实现tm之间的数据交换

文章目录

  • 1. NetworkStack整体架构
  • 2. StreamTask内数据流转过程

NetworkStack提供了高效的网络I/O和反压控制

除了各个组件之间进行RPC通信之外,在Flink集群中TaskManager和TaskManager节点之间也会发生数据交换,尤其当用户提交的作业涉及Task实例运行在不同的TaskManager上时。Task实例之间的数据交换主要借助Flink中的NetworkStack实现。NetworkStack不仅提供了非常高效的网络I/O,也提供了非常灵活的反压控制。

 

1. NetworkStack整体架构

通过Netty协议实现的NetworkStack

Flink NetworkStack整体架构在不同的TaskManager之间建立TCP连接,而TCP连接则主要依赖Netty通信框架实现。Netty是一个NIO网络编程框架,可以快速开发高性能、高可靠性的网络服务器/客户端程序,能够极大简化TCP和UDP等网络编程。

流程举例:

TaskManager中会运行多个Task实例,例如在TaskManager 1中运行了Task A-1和Task A-2,在TaskManager 2中运行了Task B-1和Task B-2,Task A中从外部接入数据并处理后,会通过基于Netty构建的TCP连接发送到Task B中继续进行处理。整个数据传输过程主要基于Flink的NetworkStack框架进行。

 

上游数据流转逻辑:二进制buffer->ResultSubPartition队列->InputChannel

对于上游的Task A实例来讲,经过Operator处理后的数据,最终会通过RecordWriter组件写入网络栈,即算子输出的数据并不是直接写入网络,而是先将数据元素转换为二级制Buffer数据,并将Buffer缓存在ResultSubPartition队列中,接着写入下游Task对应的InputChannel。在上游的Task中会创建LocalBufferPool为数据元素申请对应Buffer的存储空间,且上游的Task会创建NettyServer作为网络连接服务端,并与下游Task内部的NettyClient之间建立网络连接。

 
在这里插入图片描述

 

下游Task数据接收逻辑:InputGate的InputChannel接收->StreamTaskInput取数据并处理(反序列化)->OperatorChain

  • 对下游的Task实例来讲,会通过InputGate组件接收上游Task发送的数据,在InputGate中包含了多个InputChannel。InputChannel实际上是将Netty中Channel进行封装,数量取决于Task的并行度
  • 上游Task的ResultPartition会根据ChannelSelector选择需要将数据下发到哪一个InputChannel中,其实现类似Shuffe的数据洗牌操作
  • 在下游的Task实例中可以看出,InputGate中接收到的二进制数据,会转换为Buffer数据结构并存储到本地的Buffer队列中,最后被StreamTaskInput不断地从队列中拉取出来并处理。StreamTaskInput会将Buffer数据进行反序列化操作,将Buffer数据转换为StreamRecord并发送到OperatorChain中继续处理。

 

2. StreamTask内数据流转过程

流式作业中OperatorChain转为StreamTask

在ExecutionGraph调度和执行ExecutionVertex节点的过程中,会将OperatorChain提交到同一个Task实例中运行。如果被调度的作业为流式类型,则AbstractInvokable的实现类就为StreamTask。最终StreamTask会被TaskManager中的Task线程触发执行。

根据数据源不同,StreamTask分为两种类型:

  1. 直接从外部源数据读取数据的SourceStreamTask和SourceReaderStreamTask;
  2. 支持从网络或本地获取数据的OneInputStreamTask和TwoInputStreamTask;

 

以OneInputStreamTask为例,分析从Task层面介绍数据从网络接入并发送到OperatorChain中进行处理,接着通过Output组建输出到下游网络中的过程。

在这里插入图片描述

 

OneInputStreamTask包含一个StreamInputProcessor,用于对输入数据进行处理和输出。在StreamInputProcessor组件中包含StreamTaskInput、OperatorChain以及DataOutput三个组成部分。

 
task内部数据流转:StreamTaskNetworkIutput -> StreamTaskNetworkOutput -> OperatorChain中的HeaderOperator -> task实例算子->Output->下游算子...->RecordWriter->网络。详细过程如下:

  1. StreamTaskInput从Task外部获取数据。

根据不同的数据来源,StreamTaskInput的实现主要分为从网络获取数据的StreamTaskNetworkInput和从外部系统获取数据的StreamTaskSourceInput。

  1. DataOutput负责将StreamTaskInput接收的数据发送到当前Task实例的OperatorChain的HeadOperator中进行处理。

DataOutput主要有StreamTaskNetworkOutput(用于处理StreamTaskNetworkInput接收的数据)和StreamTaskSourceOutput(用于处理StreamTaskSourceInput接收的数据)两种实现。

  1. HeaderOperator接收数据,算子开始接收数据并进行处理

OperatorChain负责将能够运行在同一个Task实例中的Operator连接起来,然后形成算子链,且算子链中HeaderOperator会暴露给StreamTask。当StreamTaskNetworkIutput接收到网络数据后,就会通过StreamTaskNetworkOutput组件将数据元素发送给OperatorChain中的HeaderOperator进行处理,此时Task实例中的算子就能够接收数据并进行处理了。

  1. 上一个算子处理的数据会通过Output组件发送到下一个算子中继续处理
  1. 在OperatorChain中,除了具有HeaderOperator之外,还包含了其他算子,这些算子会按照拓扑关系连接到HeaderOperator之后,每个算子之间的数据传输通过Output组件相连,即在OperatorChain中,上一个算子处理的数据会通过Output组件发送到下一个算子中继续处理。注意:DataOutput强调的是从外部接入数据到Task实例后再转发到HeaderOperator中,Output则更加强调算子链内部的数据传递。
  2. Output组件的实现主要有ChainingOutput、BroadcastingOutputCollector、DirectedOutput和RecordWriterOutput等类型,它们最大的区别在于数据下发的方式不同,例如ChainingOutput代表直接向下游算子推送数据。
  1. RecordWriterOutput中RecordWriter组件将数据发送到网络

经过算子链处理后的数据,需要发送到网络中供下游的Task实例继续处理,此时需要通过RecordWriterOutput完成数据的网络输出。RecordWriterOutput中包含了RecordWriter组件,用于将数据输出到网络中,下游Task实例就能通过StreamTaskInput组件从网络中获取数据,并继续传递到Task内部的算子链进行处理。

小结:
在StreamTask中接入数据,然后通过OperatorChain进行处理,再通过RecordWriterOutput发送到网络中,下游Task节点则继续从网络中获取数据并继续处理,最后组合这些Task节点就形成了整个Flink作业的计算拓扑。

注意:Task节点的数据输入也可以是本地类型,这种情况主要出现在Task实例被执行在同一台TaskManager时,数据不需要经过网络传输。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

个人博客系列-环境配置-gitee(2)

注册gitee账户 地址:https://gitee.com/ 此步骤省略 新建仓库 执行以下命令 即可 拉取代码 创建目录 mkdir myCode && cd myCode 登录gitee找到项目,点击克隆,拉取代码 连接远程仓库命令 git remote add origin 仓库地址http…

PCIe 5.0 Layout Guide笔记

一、松耦合和紧耦合 松耦合优点是相同走线宽度下电介质更薄,同时对线间距的变化不敏感,提供了更好的阻抗控制;松耦合缺点是需要更大的区域进行绕线;紧耦合优点是更高的布线密度,相同阻抗下走线可以更细,同时具有更好的共模噪声抑制;紧耦合缺点是阻抗随线间距的变化大;【…

单片机02_寄存器_GPIO设置__点灯

芯片概述 C51:0口、1口、2口、3口,P00~p07、P10~P17、P20~P27、P30~P37 STM32:A口、B口、C口、D口,PA0~PA15/PA5 GPIOA.5 STM32F407ZGT6有7组GPIO端口,分别是:A B C D E F G,每组均有16个GPIO端…

Linux Android USB gadget(从设备驱动)

Linux Android USB gadget 一:Linux usb gadget 与 Android Composite Gadget二:原生方式和Android方式如何配置函数调用逻辑内核配置原生驱动android驱动三:mass_storage配置虚拟化U盘四:遍历usb设备五:adb usb判断usb设备为adb获取adb配置信息adb设备序列号发送与接收《Linux…

vue中使用echarts绘制双Y轴图表时,刻度没有对齐的两种解决方法

文章目录 1、原因2、思路3、解决方法3.1、使用alignTicks解决3.2、结合min和max属性去配置interval属性1、首先固定两边的分隔的段数。2、结合min和max属性去配置interval。 1、原因 刻度在显示时,分割段数不一样,导致左右的刻度线不一致,不…

解决Maven爆红以及解决 Idea 卡在 Resolving问题

关于 Idea 卡在 Resolving(前提是Maven的setting.xml中配置好了阿里云和仓库) 参考文章https://blog.csdn.net/jiangyu1013/article/details/95042611 解决Maven爆红参考文章https://devpress.csdn.net/beijing/656d993b76f0791b6eca7bb0.html?dp_toke…

可在线免费使用的5款ChatGPT平替网站!

可在线免费使用的5款ChatGPT平替网站! 渗透智能 ShirtAI 是一款全方位AI产品,集成问答绘画导图等功能!支持联网功能、 支持上下文对话、支持模糊匹配自定义回复消息、 支持注册配置自定义赠送额度、支持生成专属邀请码邀请用户双方共同获得额度。 https…

【深蓝学院】移动机器人运动规划--第6章 模型预测控制(MPC)与运动规划--笔记

0. Outline 1. Reactive Control(反应式控制) 控制学中的 “Reactive Control” 通常指的是一种控制策略,它依赖于系统对特定事件或变化的即时反应,而不是按照预定的计划或策略行动。这种控制往往是基于当前的传感器输入来做出决…

ARM服务器部署Kafka集群

安装前必备的条件是: (1)安装jdk(提供环境); (2)安装zookeeper(注册kafka信息); 需要这方面信息的可以查看我之前写的文档; 一.下载安装包 Kafka官网下载地址 Apache Kafka 根据自己需要下载相应的版本 目前最新的版本是3.6.1。 二.解压安装包 服务器上传下载好的kafk…

紫光同创初使用

芯片PGC2KG-6LPG144 1、安装好软件接,加载license,有两个,与电脑MAC地址绑定的 2、正常使用后,新建个工程,配置管脚Tools→UCE 3、程序中有些信号被软件认为是时钟信号,会报错(时钟输入I0约束在非专用时钟…

【Python如何求出水仙花数】

1、求水仙花数Python代码如下: # 求水仙花数:只需要个十百位的3次幂之和与原数相等 for i in range(100, 1000): # 循环100-999整数i1 i % 10 # 取个位 “%”表示除以后取余数i2 i // 10 % 10 # 取十位i3 i // 100 # 取百位 “//”表示除以后取整…

使用 yarn 的时候,遇到 Error [ERR_REQUIRE_ESM]: require() of ES Module 怎么解决?

晚上回到家,我打开自己的项目,执行: cd HexoPress git pull --rebase yarn install yarn dev拉取在公司 push 的代码,然后更新依赖,最后开始今晚的开发时候,意外发生了,竟然报错了,…

[网鼎杯 2020 白虎组]PicDown

网鼎杯的,这应该是送分的那种 界面很普通,就长这样。源代码也没什么,随便输入试试 出现了"/page?url1" 这可能是ssrf题目。 但是尝试了一些payload发现下载了一张图片,并且url里自动补齐了127.0.0.1。使用记事本打开…

32.云原生Istio流量管理之官网Bookinfo应用实战演示

云原生专栏大纲 文章目录 流量管理基于版本的路由配置基于 Http header 的路由配置故障注入延迟故障注入异常故障注入故障注入测试 比例分配流量请求超时熔断什么是熔断创建 httpbin 服务创建访问者服务 流量管理 Istio 是服务治理的工具,Istio 的流量管理能力&am…

基于SpringBoot的气象数据监测分析大屏

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…

Jetpack Compose 架构层

点击查看:Jetpack Compose 架构层 官网 本页面简要介绍了组成 Jetpack Compose 的架构层,以及这种设计所依据的核心原则。 Jetpack Compose 不是一个单体式项目;它由一些模块构建而成,这些模块组合在一起,构成了一个完…

大模型+影像:智能手机“上春山”

这个春节假期,一首《上春山》火了。吃瓜群众热热闹闹学了一个假期的“春山学”,了解了抢占C位的各种技巧。 假期过去,开工大吉,手机行业开始抢占今年的C位。那么问题来了,今年智能手机最大的机会点在哪里?答…

SpringCloud(16)之SpringCloud OpenFeign和Ribbon

一、Spring Cloud OpenFeign介绍 Feign [feɪn] 译文 伪装。Feign是一个轻量级的Http封装工具对象,大大简化了Http请求,它的使用方法 是定义一个接口,然后在上面添加注解。不需要拼接URL、参数等操作。项目主页:GitHub - OpenFeign/feign: Feign makes w…

leetcode刷题日志-98.验证二叉搜索树

思路:根据二叉搜索树的性质,中序遍历满足升序。那么我们就可以使用中序dfs,并且记录每个节点的前一个节点的值,如果前一个节点值比后一个大,返回false。 class Solution {Integer pre null; //记录前序节点boolean …

[NCTF2019]True XML cookbook --不会编程的崽

题目的提示很明显了&#xff0c;就是xxe攻击&#xff0c;直接抓包。 <?xml version "1.0"?> <!DOCTYPE ANY [ <!ENTITY xxe SYSTEM "file:///etc/passwd" > ]> <user><username> &xxe; </username><passwor…