如何理解Apache Flink中的setParallelism函数

How to understand the function setParallelism in Apache Flink

https://ci.apache.org/projects/flink/flink-docs-stable/dev/parallel.html

我正在阅读Flink的这个文档,我不太了解执行环境级别的部分。

让我们以 WordCount 为例。

那么,如果我在这个例子中编码 env.setParallelism(3);,是否意味着我将拥有三个 Source + map() --- keyBy()/window()/apply() --- Sink 的并行管道?让我困惑的是,如果我有三个 Sink,我怎么能正确得到结果?

如果只有一个Sink,我想不会有任何问题。我的意思是不管我有多少Source + map(),只有Sink可以产生一个结果。但是现在我有三个 Sinks...

// Case 1
Source + map() --- keyBy()/window()/apply() ----\
Source + map() --- keyBy()/window()/apply() --- Sink (the only Sink will merge the outputs coming from three pipelines and produce only one result)
Source + map() --- keyBy()/window()/apply() ----/

// Case 2
Source + map() --- keyBy()/window()/apply() --- Sink
Source + map() --- keyBy()/window()/apply() --- Sink
Source + map() --- keyBy()/window()/apply() --- Sink
// There are three sinks, how could I get the result?

所以我们不应该在这个例子中使用 setParallelism() 还是我误解了什么?

并行接收器本身并没有错。例如,Kafka 接收器的不同实例将写入不同的分区。 StreamingFileSink 将并行写入不同的存储桶,各种数据库连接器可以为不同的键更新或插入记录等。可扩展的流处理要求管道的所有部分都能够扩展,包括接收器。

在您描述的管道的情况下,window 和接收器可以链接在一起。如果接收器是打印接收器并且它是并行使用的,那么每个任务管理器都会将其结果片段写入本地输出文件。显然,如果您的 objective 是将所有结果集中在一个地方,这不是很方便,在这种情况下,您需要将 sink 运算符的并行度设置为 1。但是许多应用程序没有这样的要求。