文章目录
1. 数据流图(Dataflow Graph)
所有的 Flink 程序都可以归纳为由三部分构成:Source、Transformation 和 Sink
Source 表示“源算子”,负责读取数据源
Transformation 表示“转换算子”,利用各种算子进行处理加工
Sink 表示“下沉算子”,负责数据的输出

在运行时,Flink 程序会被映射成所有算子按照逻辑顺序连接在一起的一张图,这被称为逻辑数据流(logical dataflow),或者叫数据流图(dataflow graph)
数据流图类似于有向无环图(DAG),每一条数据流(dataflow)以一个或多个 source 算子开始,以一个或多个 sink 算子结束。
除了 Source 读取数据和 Sink 输出数据,一个中间的转换算子(Transformation Operator)必须是一个转换处理的操作;而在代码中有一些方法调用,数据是没有完成转换的。可能只是对属性做了一个设置,也可能定义的是数据的传递方式而非转换,又或者是需要几个方法合在一起才能表达一个完整的转换操作
如:
keyBy方法 ,就只是一个数据分区操作,而并不是一个算子。在代码中可以看到调用其他转换操作之后返回的数据类型是 SingleOutputStreamOperator,说明这是一个算子操作;而 keyBy 之后返回的数据类型是 KeyedStream

2. 并行度(Parallelism)
2.1 并行子任务和并行度
把一个算子操作,“复制”多份到多个节点,数据来了之后就可以到其中任意一个执行。这样一来,一个算子任务就被拆分成了多个并行的“子任务”(subtasks),再将它们分发到不同节点,就真正实现了并行计算。
在 Flink 执行过程中,每一个算子(operator)可以包含一个或多个子任务(operator subtask),这些子任务在不同的线程、不同的物理机或不同的容器中完全独立地执行。

一个特定算子的子任务(subtask)的个数被称之为其并行度(parallelism)。包含并行子任务的数据流,就是并行数据流,它需要多个分区(stream partition)来分配并行任务。一般情况下,一个流程序的并行度,可以认为就是其所有算子中最大的并行度。一个程序中,不同的算子可能具有不同的并行度。
2.2并行度的设置优先级
(1)对于一个算子,首先看在代码中是否单独指定了它的并行度,这个特定的设置优先级最高,会覆盖后面所有的设置
(2)如果没有单独设置,那么采用当前代码中执行环境全局设置的并行度
(3)如果代码中完全没有设置,那么采用提交时-p 参数指定的并行度
(4)如果提交时也未指定-p 参数,那么采用集群配置文件中的默认并行度

本文详细介绍了Apache Flink的数据流图、并行度、算子链、作业图与执行图,以及任务和任务槽的概念。重点讨论了并行度的设置及其对任务执行的影响,强调了算子链在性能优化中的作用,并解释了任务与任务槽的关系,为理解Flink的分布式计算提供了深入的洞察。
最低0.47元/天 解锁文章
3044

被折叠的 条评论
为什么被折叠?



