Flink概念基础-并行度、算子链

并行度 

算子链 


并行度 

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

        如图,当前数据流中有 Source、map()、keyBy()/window()/apply()、Sink 四个算子, 除最后 Sink,其他算子的并行度都为 2。整个程序包含了 7 个子任务,至少需要 2 个分区来并 行执行。我们可以说,这段流处理程序的并行度就是 2。

        代码中并行度的设置 

        我们在代码中,可以很简单地在算子后跟着调用 setParallelism()方法,来设置当前算子的并行度,这种方式设置的并行度,只针对当前算子有效。

stream.map((_,1)).setParallelism(2)

        另外,我们也可以直接调用执行环境的 setParallelism()方法,全局设定并行度:

env.setParallelism(2)

        这样代码中所有算子,默认的并行度就都为 2 了。我们一般不会在程序中设置全局并行度, 因为如果在程序中对全局并行度进行硬编码,会导致无法动态扩容。

这里要注意的是,由于 keyBy()方法返回的不是算子,所以无法对 keyBy()设置并行度。

        提交作业时设置 

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

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

         配置文件中设置

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

parallelism.default: 2

        这个设置对于整个集群上提交的所有作业有效,初始值为 1。无论在代码中设置、还是提 交时的-p 参数,都不是必须的。所以,在没有指定并行度的时候,就会采用配置文件中的集 群默认并行度。

算子链 

        在 Flink 中,并行度相同的一对一(one to one)算子操作,可以直接链接在一起形成一个 “大”的任务(task),这样原来的算子就成为真正任务里的一部分,如图所示。每个 task 会被一个线程执行。这样的技术被称为“算子链”(Operator Chain)。

        Flink 默认会按照算子链的原则进行链接合并,如果我们想要禁止合并或者自行定义,也 可以在代码中对算子做一些特定的设置:

// 禁用算子链
.map((_,1)).disableChaining()
// 从当前算子开始新链
.map((_,1)).startNewChain()

猜你喜欢

转载自blog.csdn.net/dafsq/article/details/129674343