Flink task之间的数据交换
Flink中的数据交换是围绕着下面的原则设计的:
1.数据交换的控制流(即,为了启动交换而传递的消息)是由接收者发起的,就像原始的MapReduce一样。
2.用于数据交换的数据流,即通过电缆的实际数据传输,被抽象为了IntermediateResult,并且是可插拔的。 这意味着系统可以使用同一实现同时支持流数据传输和批处理数据传输。
数据交换也涉及到了一些角色,包括:
1.JobManager,master节点,负责任务调度,异常恢复,任务协调,并且通过ExecutionGraph这样的数据结构来保存一个作业的全景图。
2.TaskManagers,工作节点,负责将多个任务并行的在线程中执行,每个TM中包含一个CommunicationManager(在tasks之间共享)和一个MemoryManager (在tasks之间共享)。TM之间通过TCP连接来交互数据。
需要注意的是,在Flink中,数据交换是发生在TM之间的,而不是task之间,在同一个TM中的不同task会复用同一个网络连接。

ExecutionGraph,执行图是一个数据结构,其中包含有关作业计算的“基本事实”。 它由代表计算任务的顶点(ExecutionVertex)和代表任务产生的数据的中间结果(IntermediateResultPartition)组成。 顶点通过ExecutionEdges(EE)链接到它们消耗的中间结果:

这些是JobManager中存在的逻辑数据结构。它们具有与运行时等效的结构,这些结构负责TaskManager上的实际数据处理。与IntermediateResultPartition等效的运行时称为ResultPartition。
ResultPartition(RP)表示BufferWriter写入的数据块,即单个任务产生的数据块。 RP是结果子分区(RS)的集合。这是为了区分发往不同接收者的数据,例如,在用于reduce或join的分区混洗的情况下。
ResultSubpartition(RS)表示由operator创建的数据的一个分区,以及将数据转发给接收operator的逻辑。 RS的特定实现确定了实际的数据传输逻辑,这是允许系统支持各种数据传输的可插拔机制。例如,PipelinedSubpartition是支持流数据交换的管道实现。 SpillableSubpartition是一个阻止实现,支持批量数据交换。
InputGate:接收方RP的逻辑等效项。 它负责收集数据缓冲区并将其移交给上游。
InputChannel:接收方RS的逻辑等效项。 它负责为特定分区收集数据缓冲区。
序列化器和反序列化器将类型化的记录可靠地转换为原始字节缓冲区,反之亦然,处理跨越多个缓冲区的记录等。
Control flow for data exchange

该图片表示具有两个并行任务的简单map-reduce作业。我们有两个TaskManager,两个任务(一个映射任务和一个reduce任务)在两个不同的节点中运行,一个JobManager在第三个节点中运行。我们专注于任务M1和R2之间转移的启动。数据传输使用粗箭头表示,消息使用细箭头表示。首先,M1产生一个ResultPartition(RP1)(箭头1)。当RP可供消费时(我们稍后再讨论),它会通知JobManager(箭头2)。 JobManager通知该分区(任务R1和R2)的预期接收者该分区已准备就绪。如果尚未安排接收方,则实际上将触发任务的部署(箭头3a,3b)。然后,接收器将向RP请求数据(箭头4a和4b)。这将在本地(案例5a)或通过TaskManagers的网络堆栈(5b)启动任务之间的数据传输(箭头5a和5b)。当RP决定将其可用性通知JobManager时,该过程具有一定的自由度。例如,如果RP1在通知JM之前完全产生了自身(并且可能已写入文件中),则数据交换大致相当于Hadoop中实现的批量交换。如果RP1在产生第一个记录后立即通知JM,我们就可以进行流数据交换。
Transfer of a byte buffer between two tasks

序列化程序将记录序列化为它们的二进制表示形式,并将它们放置在固定大小的缓冲区中(记录可以跨越多个缓冲区)。这些缓冲区并移交给BufferWriter并写出到ResultPartition(RP)。 RP由几个子分区(ResultSubpartitions-RS)组成,这些子分区收集特定使用者的缓冲区。在图中,该缓冲区发往第二个reducer(在TaskManager 2中),并将其放置在RS2中。由于这是第一个缓冲区,因此RS2可供使用(请注意,此行为实现了流式分发),并通知JobManager。
JobManager查找RS2的使用者,并通知TaskManager 2可用数据块。发送到TM2的消息向下传播到应该接收此缓冲区的InputChannel,后者进而通知RS2可以启动网络传输。然后,RS2将缓冲区移交给TM1的网络堆栈,后者又将其移交给Netty进行运输。网络连接是长期运行的,并且存在于TaskManager之间,而不是单个任务之间。
一旦TM2接收到缓冲区,它就会通过相似的对象层次结构,从InputChannel(与IRPQ等效的接收器端)开始,到达InputGate(包含多个IC),最后在RecordDeserializer中结束,从缓冲区生成类型化的记录,并将其交给接收任务,在这种情况下为ReduceDriver。
Flink task之间的数据交换的更多相关文章
- Android:Activity+Fragment及它们之间的数据交换.
Android:Activity+Fragment及它们之间的数据交换 关于Fragment与Fragment.Activity通信的四种方式 比较好一点的Activity+Fragment及它们之间 ...
- Android Fragment与Activity之间的数据交换(Fragment从Activity获取数据)
Fragment与Activity之间的数据交换,通常含有3: 一.Fragment从Activity获取数据(仅本文介绍了一个第一): 两.Activity从Fragment获取数据: 三.Frag ...
- [转]Android:Activity+Fragment及它们之间的数据交换(一)
2014-05-18 来源:Android:Activity+Fragment及它们之间的数据交换(一) 简介: 为什么要用Fragment?使用Fragment可以在一个Acti ...
- Android:Activity+Fragment及它们之间的数据交换(一)
简单介绍: 为什么要用Fragment?使用Fragment能够在一个Activity中实现不同的界面. Fragment与Fragment之间的动画切换,远比Activity与Activity之间的 ...
- MFC拆分窗口及它们之间的数据交换(转)
转自:http://blog.csdn.net/nuptboyzhb/article/details/7455471 源代码:http://download.csdn.net/detail/nuptb ...
- MFC拆分窗口及它们之间的数据交换
源代码:http://download.csdn.net/detail/nuptboyzhb/4221531 CSplitterWnd类 CSplitterWnd类提供一个分隔器窗口的功能,分隔器窗口 ...
- OpenCV学习(6) 文件和Mat之间的数据交换
有时候为了便于调试算法,我们需要从文本文件或二进制文件中读取数据,并把数据放到相应的矩阵中去.我们通常可以通过下面的函数实现. 1.从二进制文件中读取数据. 新建一个txt文 ...
- Android两个Activity之间的数据交换
1. 不带数据 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceS ...
- Java核心知识点学习----多线程 倒计时记数器CountDownLatch和数据交换的Exchanger
本文将要介绍的内容都是Java5中的新特性,一个是倒计时记数器---CountDownLatch,另一个是用于线程间数据交换的Exchanger. 一.CountDownLatch 1.什么是Coun ...
随机推荐
- pushad与popad
版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明.2019-08-24,00:40:12作者By-----溺心与沉浮----博客园 PUSHAD与POPAD 这两条指令其实就是讲EAX,E ...
- 队列解密QQ号
队列解密QQ号 本篇博客主要是<啊哈!算法>的读书笔记,这里做一下记录. 问题场景: 给定一串 QQ 号,631758924,从其中解密出真实的 QQ 号. 解密规则:首先将第一个数删除, ...
- vuejs兄弟通信$emit和$on
1 vm.$on( event, callback ) 监听当前实例上的自定义事件.事件可以由vm.$emit触发.回调函数会接收所有传入事件触发函数的额外参数. 2 vm.$emit( even ...
- numpy,matplotlib,pandas
目录 numpy模块 numpy简介 numpy使用 matplotlib模块 条形图 直方图 折线图 散点图+直线图 pandas模块 numpy模块 numpy简介 numpy官方文档:https ...
- 简单的深度神经网络实现——使用PyTorch
使用的数据集是MNIST,预期可以达到98%左右的准确率. 该神经网络由一个输入层,一个全连接层结构的隐含层和一个输出层构建. 1.配置库和配置参数 import torch import torch ...
- Rust中的测试用例的写法
有点类似 #[derive(Debug)] pub struct Rectangle { length: u32, width: u32, } impl Rectangle { pub fn can_ ...
- JS高阶---为什么说JS是单线程执行的???
大纲: [主体] (1)如何证明JS运行是单线程的? 上述代码执行顺序结果为:fn()→timeout →timeout 接下来对上述代码做下修改 执行结果如右图所示 接下来点击确认,关闭弹框,再往后 ...
- SpingBoot四——前后端分离
◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:https://www.cnblogs.com/by-dream/p/11336057.html 根据之前的教程,我们已经可以独立 ...
- luoguP3312 [SDOI2014]数表
题意 默认\(n\leqslant m\). 设\(f(i)\)表示\(i\)的约数和,因为是积性函数,可以用线性筛求. 先不考虑\(a\)的限制,我们推下式子: \(\sum\limits_{i=1 ...
- 【未完成】【plsql】与oracle配置
待写——————————————————————————————————————-