flink之核心概念、基础配置

2024-06-13 19:46:10 浏览数 (2)

一、并行度

并行子任务:

当处理数据的数据量过大的时候,flink会把一个算子操作复制多份到多个节点,数据来了之后就可以到其中任意一个执行。这样一来,一个算子任务就被拆分成了多个并行的“子任务”(subtasks),再将它们分发到不同节点,就真正实现了并行计算。

并行度的定义:

一个特定算子的子任务(subtask)的个数被称之为其并行度(parallelism)。包含并行子任务的数据流,就是并行数据流,它需要多个分区(stream partition)来分配并行任务。一般情况下,一个流程序的并行度,可以认为就是其所有算子中最大的并行度。一个程序中,不同的算子可能具有不同的并行度。

并行度的设置:四个方面

1、代码中设置

1.1、操作算子层面(Operator Level)

在代码中,可以很简单地在算子后跟着调用setParallelism()方法,来设置当前算子的并行度:

这种方式设置的并行度,只针对当前算子有效。

stream.map(word -> Tuple2.of(word, 1L)).setParallelism(2);

1.2、执行环境层面(Execution Environment Level)

可以直接调用执行环境的setParallelism()方法,全局设定并行度,这样代码中所有算子,默认的并行度就都为2

(一般不推荐,无法动态扩容并行度)

注意的是,由于keyBy不是算子,所以无法对keyBy设置并行度

env.setParallelism(2);

2、提交应用时设置

2.1、客户端层面(Client Level)

使用flink run命令提交应用时,可以增加-p参数来指定当前应用程序执行的并行度,它的作用类似于执行环境的全局设置:

bin/flink run –p 2 –c com.atguigu.wc.StreamWordCount ./FlinkTutorial-1.0-SNAPSHOT.jar

3、配置文件中设置

3.1、系统层面(System Level)

可以直接在集群的配置文件flink-conf.yaml中直接更改默认并行度:

parallelism.default: 2

需要注意的优先级算子层面>环境层面>客户端层面>系统层面。一句话总结(谁的影响小,谁的优先级高)

并行度的设置:一般设为kafka的分区数,达到1:1; 遵循2的n次方:比如2、4、8、16……

原因如下:

1、充分利用资源:

当 Flink 的并行度与 Kafka 的分区数相匹配时,每个分区都可以由一个独立的并行任务来处理。这样可以确保每个任务都能充分利用分配给它的资源,避免资源闲置或竞争。

例如,如果有 10 个 Kafka 分区和 10 个 Flink 并行任务,每个任务可以专注于处理一个分区的数据,从而实现高效的并行处理。

2、数据均衡分布:

Kafka 的分区机制将数据分散到不同的分区中,以实现数据的均衡分布。

通过将 Flink 的并行度设置为与分区数相同,可以确保每个并行任务处理的数据量相对均衡。这有助于避免某些分区数据量过大而导致的处理延迟或数据倾斜问题。每个任务处理相对均衡的数据量,可以提高整体的处理效率和性能。

3、提高处理效率:

遵循 2 的 n 次方设置并行度,可以使任务在执行过程中更好地利用 CPU 缓存和内存。这是因为 2 的 n 次方通常是计算机体系结构中的一个优化点,可以提高数据访问和处理的效率。

例如,当并行度为 2、4、8、16 等时,任务可以更好地利用 CPU 的缓存行大小、内存分页等特性,减少数据的缓存缺失和内存访问开销,从而提高处理效率。

0 人点赞