如何理解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
可以产生一个结果。但是现在我有三个 Sink
s...
// 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。但是许多应用程序没有这样的要求。
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
可以产生一个结果。但是现在我有三个 Sink
s...
// 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。但是许多应用程序没有这样的要求。