【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时,数据不需要经过网络传输。

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c编译器学习07:minilisp编译器改造(debug模式支持调试)

问题 原版的minilisp编译器不支持argv输入测试,不方便单步调试。 代码改造目标是既不改变原有程序的各种功能, 又能支持个人习惯的vs单步debug模式。 CMakeLists.txt变更 定义DEBUG宏 解决单步调试源码定位偏差问题 cmake_minimum_required(VERSION …

springboot邮箱注册

1.准备工作 操作之前准备两个邮箱 我准备了网易邮箱和QQ邮箱,网易邮箱用来发送验证码,QQ邮箱用来做注册(希望大家和我一样,不然可能会出错 ) 发送验证码的邮箱需要开启一些设置,否则不…

windows server2008前后端项目部署

目录 一.部署环境 准备一个windows server 2008的镜像 准备jdk1.8 准备tomcat服务器 准备mysql数据库 二.部署步骤 1.1新建虚拟机 1.2打开远程 连接宿主机远程桌面 1.3下载安装jdk 修改path 1.4安装tomcat 1.5.安装mysql mysql安装成功 把war包丢到tomcat webapp里面去…

Selenium IDE插件录制网页,解放双手

1、 国内下载地址 https://www.crx4chrome.com/crx/77585/ ,这个网络正常基本可以下载,目前最新版本是3.17.2。 点击Crx4Chrome下载。下载后的文件名称是:mooikfkahbdckldjjndioackbalphokd-3.17.2-Crx4Chrome.com.crx。 2、 安装 直接打开…

【MySQL】数据库概述

目录 一、为什么使用数据库? 二、数据库与数据库管理系统 2.1 相关概念 2.2 两者关系 三、 MySQL介绍 四、 RDBMS和非RDBMS 4.1 关系型数据库(RDBMS) 4.2 非关系型数据库(非RDBMS) 五、关系型数据库设计规则 …

挑战杯 基于卷积神经网络的乳腺癌分类 深度学习 医学图像

文章目录 1 前言2 前言3 数据集3.1 良性样本3.2 病变样本 4 开发环境5 代码实现5.1 实现流程5.2 部分代码实现5.2.1 导入库5.2.2 图像加载5.2.3 标记5.2.4 分组5.2.5 构建模型训练 6 分析指标6.1 精度,召回率和F1度量6.2 混淆矩阵 7 结果和结论8 最后 1 前言 &…

QT问题 打开Qt Creator发现没有菜单栏

之前不知道按了什么快捷键,当我再次打开Qt Creator时发现菜单栏消失啦 找了许多原因发现:安装有道词典的快捷键Ctrl Alt m 与Qt Creator里的快捷键冲突导致菜单栏被莫名其妙的隐藏 解决方法: 1找到有道词典快捷键 2再次按快捷键 Ctrl Alt m就可以重新显示菜单栏

机器学习---强化学习方法

1. 强化学习方法 1.1 动态规划法 动态规划方法是由Bellman 方程转化而来,通过修正Bellman 方程的规则,提高所期望值函数的近 似值。常用算法有两种:值迭代(Value Iteration)和策略迭代(Policy Iteration…

[云原生] 二进制k8s集群(下)部署高可用master节点

在上一篇文章中,就已经完成了二进制k8s集群部署的搭建,但是单机master并不适用于企业的实际运用(因为单机master中,仅仅只有一台master作为节点服务器的调度指挥,一旦宕机。就意味着整个集群的瘫痪,所以成熟…

较通用web脚手架模板搭建

较通用web脚手架模板搭建 从这里开始就接触到以后写项目的思维了。 做一个web开发,那就要层次分明,要有个实现的规划,这通常也是有一个较为通用的模板的。 总的来说:不同的层次有不同的模块,每个模块有必须实现的功…

【开源】JAVA+Vue.js实现校园电商物流云平台

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 商品数据模块2.3 快递公司模块2.4 物流订单模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 商品表3.2.2 快递公司表3.2.3 物流订单表 四、系统展示五、核心代码5.1 查询商品5.2 查询快递公司5.3 查…

一种基于javax.max注解的能力增强技术

目录 现有框架的不足之处 我的改进内容 改进的成果 现有框架的不足之处 Max是javax.validation包中的一个常用注解,用于对传入参数进行最大值校验。但是其校验区间为闭区间,且不支持修改,如:Max(2),表示表示传入参…