【Flink系列三】数据流图和任务链计算方式

上文介绍了如何计算并行度和slot的数量,本文介绍Flink代码提交后,如何生成计算的DAG数据流图。

程序和数据流图

  • 所有的Flink程序都是由三部分组成的:Source、Transformation和Sink
  • Source负责读取数据源,Transformation利用各种算子进行处理加工(Flink不区分transfer算子和action算子,统一都认为算子),Sink负责输出
  • 在运行时,Flink上运行的程序会被映射成“逻辑数据流”(dataflows),它包含了这三部分
  • 每一个dataflow以一个或者多个Source开始,以一个或者多个sink结束。dataflow类似于任意的有向无环图(DAG)
  • 在大部分情况下,程序中的转换运算(transformations)跟dataflow中的算子(operator)是一一对应的关系

最终生成的数据流图

执行图(ExecutionGraph)

Flink中的执行图可以分成四层:StreamGraph -> JobGraph -> ExecutionGraph ->物理执行图

  • StreamGraph:是根据用户通过Stream API 编写的代码生成的最初的图。用来表示程序的拓扑结构
  • JobGraph:StreamGraph经过优化后生成了JobGraph,提交给JobManager的数据结构。主要的优化为,将多个符合条件的节点chain在一起作为一个节点(注意这个符合条件的计算方式)
  • ExecutionGraph: Jobanager根据JobGraph生成ExecutionGraph。ExecutionGraph是JobGraph的并行化版本,是调度层最核心的数据结构
  • 物理执行图:JobManager根据ExecutionGraph对Job进行调度后,在各个TaskManager上部署Task后形成的“图”, 并不是一个具体的数据结构。

用一张图表达

  1. 代码提交运行后,会在Client生成StreamGraph初始化版本,有一个操作就会生成一个算子任务
  2. keyby操作不会进行计算,只是简单的分区,aggregation操作才是计算,所以一开始keyby和Aggregation都是合并在一个算子任务中
  3. 将满足条件的算子合并成一个大任务(one-to-one),所以讲keybyAggregation 和Sink合并成一个任务
  4. 在JM上生成ExecutionGraph,按并行度将任务展开,通过ExecutionEdge连接
  5. 执行图和物理执行图已经非常相似了,目前只需要关心ExecutionGraph即可

数据传输形式

  • 一个程序中,不同的算子可能具有不同的并行度
  • 算子之间的传输数据的形式可以是one-to-one(forwarding)的模式,也可以是redistributing的模式,具体是哪一种形式,可以取决于算子的种
  1. One-to-One:Stream维护着分区以及元素的顺序(比如source和map之间)。这意味着map算子的子任务看到的元素的个数以及顺序跟source算子的子任务生产的元素的个数、顺序相同,map、filter、flatmap等算子都是one-to-one的对应关系。
  2. Redistributing:stream的分区会发生改变。每一个算子的子任务依据所选择的transformation发送数据到不同的目标任务。例如keyBy基于hashCode重分区、而broadcast和rebanlance会算计重新分区,这些神算子都会引起redistribute过程,而redistribute过程就类似于spark中的shuffle过程。

任务链(Operator Chains)

  • Flink采用了一种称为任务链的优化技术,可以在特定的条件下减少通过本地通信的开销。为了满足任务链的要求,必须将两个或者多个算子设为下个年头给你的并行度,通过本地转发(local forward)的方式进行连接
  • 相同并行度的one-to-one操作,Flink这样相连的算子链接在一起形成一个task,原来的算子称为里面的subtask
  • 并行度相同,并且是one-to-one操作,两个条件缺一不可

如下图,红框标注的 Forward代表数据是one-to-one的,可以进行任务合并,但是Hash和Reblance不行。(图中为了分开展示设置了不同的slotGroup)

如果不设置共享组的话,算子任务会合并

下面来看一下一个视图

大家可以看出,只有并行度相同,且one-to-one操作才能合并task

如果不想合并task呢,大家可以思考一下,这里给出答案

  1. 设置共享组(上一篇文章有介绍),但是这种方式会造成资源的浪费
  2. 通过disableOperatorChaining来设置,可以作用于env上(表达所有算子任务都不合并),作用于单个算子上时使用disableChaining或者startNewChain,具体使用看具体业务场景

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

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

相关文章

【Python】np.save()和np.load()函数详解和示例

本文通过函数原理和运行示例,对np.save()和np.load()函数进行详解,以帮助大家理解和使用。 更多Numpy函数详解和示例,可参考 【Python】Numpy库近50个常用函数详解和示例,可作为工具手册使用 目录 np.save (&#xff…

学会使用这个魔法棒,再也不用在容器里安装乱七八糟的命令工具了!

在构建镜像的时候,我总是倾向于极简构建,一切没有必要的软件包都不安装,以此来缩小镜像的容量。但是这种做法为后续运维带来了一些困难,如在日常查询、排查问题的时候发现很多命令用不了,不得不在容器中安装额外的命令…

Python Nuitka打包指南

更多Python学习内容:ipengtao.com 大家好,我是彭涛,今天为大家分享 Python Nuitka打包指南,全文2100字,阅读大约8分钟。 在Python应用程序开发中,打包是将代码和依赖项组合成可执行文件或库的关键步骤之一…

Django + Matplotlib:实现数据分析显示与下载为PDF或SVG

写作背景 首先,数据分析在当前的信息时代中扮演着重要的角色。随着数据量的增加和复杂性的提高,人们对于数据分析的需求也越来越高。 其次,笔者也确确实实曾经接到过一个这样的开发需求,甲方是一个医疗方面的科研团队&#xff0…

JavaSE基础50题:10. 计算1/1-1/2+1/3-……+1/99-1/100的值(两种方法)

概述 计算1/1 - 1/2 1/3 - …… 1/99 - 1/100的值。 当分母为偶数时,符号是负的,放分母为奇数时,符号是负的。 方法一 用 flg 做了一个正负交替 【代码】 public static double func() {double sum 0;int flg 1; //设置正负号的for (i…

LeetCode Hot100 46.全排列

题目&#xff1a; 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 代码&#xff1a; class Solution {private int[] nums;private List<Integer> path; // 记录路径上的数&#xff0c;已选数字private boo…

Linux学习笔记之八(进程间的共享内存)

Linux 1、引言2、实现共享内存2.1、创建一个共享内存2.2、将共享内存链接到进程空间2.3、断开与共享内存的链接2.4、对共享内存进行后续操作 3、应用实例 1、引言 在之前一篇文章Linux学习笔记之六&#xff08;进程之间的管道通信和信号处理&#xff09;中我讲了进程间可以通过…

Unity中Batching优化的GPU实例化(2)

文章目录 前言一、GPU实例化的Shader准备步骤1、在Pass中声明实例化需要的变体2、UNITY_VERTEX_INPUT_INSTANCE_ID 在顶点着色器的输入(appdata)和输出(v2f可选)中添加(uint instanceID : SV_InstanceID). 前言 在上篇文章中&#xff0c;我们做了一些GPU实例化的前置准备&…

使用arcpy移除遥感影像云层

先讲思路&#xff0c;然后上代码&#xff1a; 去除云层 思路1&#xff1a; 如果同一地理区域的多个图像&#xff0c;其中一些部分有丰富的云&#xff0c;而另一些部分没有云&#xff0c;则可以将它们组合起来&#xff0c;以便无云的部分替代多云的部分。这种方法很简单&…

[原创][6]探究C#多线程开发细节-“ConcurrentDictionary<T,T>解决多线程的无顺序性的问题“

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX QQ联系: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、D…

Data Mining数据挖掘—2. Classification分类

3. Classification Given a collection of records (training set) – each record contains a set of attributes – one of the attributes is the class (label) that should be predicted Find a model for class attribute as a function of the values of other attribu…

从传统到胜利:广汽集团汽车产业创新之旅

置身于汽车行业百年未有之大变局&#xff0c;作为传统车企中的排头兵&#xff0c;广汽创新可圈可点&#xff0c;广汽近年来取得了骄人业绩&#xff0c;不论是整体产销规模&#xff0c;还是新能源汽车产业化、新技术领域开拓等&#xff0c;都呈现节节攀升的局面。本文奖从产业变…