我刚刚得到了并行性的示例,并提出了一些相关问题:
-
setParallelism(5)将Parallelism 5设置为flatMap和sum的和?
-
我们是否可以将不同的Parallelism设置为不同的运算符,例如flatMap和sum?例如将Parallelism 5设置为sum,将10设置为flatMap .
-
根据我的理解,keyBy是根据不同的密钥将DataStream分区为逻辑Stream \ partitions,并假设有10,000个不同的密钥值,因此有10,000个不同的分区,那么有多少个线程处理10,000个分区?只需5个帖子?如果我们没有设置setParallelism(5)怎么样?
https://ci.apache.org/projects/flink/flink-docs-release-1.3/dev/parallel.html
final StreamExecutionEnvironment env =
StreamExecutionEnvironment.getExecutionEnvironment();
DataStream<String> text = [...]
DataStream<Tuple2<String, Integer>> wordCounts = text
.flatMap(new LineSplitter())
.keyBy(0)
.timeWindow(Time.seconds(5))
.sum(1).setParallelism(5);
wordCounts.print();
env.execute("Word Count Example");
1 回答
在运算符上调用
setParallelism
时,它会更改此特定运算符的并行度 . 因此,在您的示例中,只有窗口运算符将以5
的并行性和前面的具有默认并行度的flatMap
运算符执行 .因此,您可以为每个运算符设置不同的并行度 . 但是,请注意,具有不同并行性的运算符无法链接并需要重新 balancer (类似于shuffle)操作 .
如果要为所有运算符设置并行度,则必须通过
ExecutionEnvironment#setParallelism
API调用来完成 .keyBy
操作将输入流分区为与并行运算符实例一样多的分区 . 这可确保具有相同键的所有元素最终位于同一分区中 . 因此,在您将并行性设置为5
的示例中,最终会得到5个分区 . 每个分区都可以包含具有不同键的元素 .