图 4-8 并行数据流
一个特定算子的子任务(subtask)的个数被称之为其并行度(parallelism)。这样,包含并
行子任务的数据流,就是并行数据流,它需要多个分区(stream partition)来分配并行任务。
一般情况下,一个流程序的并行度,可以认为就是其所有算子中最大的并行度。一个程序中,
不同的算子可能具有不同的并行度。
如图 4-8 所示,当前数据流中有 Source、map()、keyBy()/window()/apply()、Sink 四个算子,除
最后 Sink,其他算子的并行度都为 2。整个程序包含了 7 个子任务,至少需要 2 个分区来并行
执行。我们可以说,这段流处理程序的并行度就是 2。
2. 并行度的设置
在 Flink 中,可以用不同的方法来设置并行度,它们的有效范围和优先级别也是不同的。
(1) 代码中设置
我们在代码中,可以很简单地在算子后跟着调用 setParallelism()方法,来设置当前算子的
并行度:
stream.map((_,1)).setParallelism(2)
这种方式设置的并行度,只针对当前算子有效。
另外,我们也可以直接调用执行环境的 setParallelism()方法,全局设定并行度:
env.setParallelism(2)
这样代码中所有算子,默认的并行度就都为 2 了。我们一般不会在程序中设置全局并行度,因为如
果在程序中对全局并行度进行硬编码,会导致无法动态扩容。
这里要注意的是,由于 keyBy()方法返回的不是算子,所以无法对 keyBy()设置并行度。
(2) 提交作业时设置
在使用 flink run 命令提交作业时,可以增加-p 参数来指定当前应用程序执行的并行度,
它的作用类似于执行环境的全局设置:
如果我们直接在Web UI 上提交作业,也可以在对应输入框中直接添加并行度。
(3) 配置文件中设置
我们还可以直接在集群的配置文件 flink-conf.yaml 中直接更改默认并行度:
bin/flink run –p 2 –c com.atguigu.wc.StreamWordCount
./FlinkTutorial-1.0-SNAPSHOT.jar