首页 文章

Flink中操作员Parallelism的一些难题

提问于
浏览
2

我刚刚得到了并行性的示例,并提出了一些相关问题:

  • 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 回答

  • 2

    在运算符上调用 setParallelism 时,它会更改此特定运算符的并行度 . 因此,在您的示例中,只有窗口运算符将以 5 的并行性和前面的具有默认并行度的 flatMap 运算符执行 .

    因此,您可以为每个运算符设置不同的并行度 . 但是,请注意,具有不同并行性的运算符无法链接并需要重新 balancer (类似于shuffle)操作 .

    如果要为所有运算符设置并行度,则必须通过 ExecutionEnvironment#setParallelism API调用来完成 .

    keyBy 操作将输入流分区为与并行运算符实例一样多的分区 . 这可确保具有相同键的所有元素最终位于同一分区中 . 因此,在您将并行性设置为 5 的示例中,最终会得到5个分区 . 每个分区都可以包含具有不同键的元素 .

相关问题