flink中算子并行性的几个问题

u5rb5r59  于 2021-06-25  发布在  Flink
关注(0)|答案(2)|浏览(619)

我刚刚得到了下面的并行性示例,并提出了一些相关问题:
setparallelism(5)是将parallelism 5设置为sum还是同时设置flatmap和sum?
我们是否可以将不同的并行度分别设置为不同的运算符,例如flatmap和sum?例如将并行度5设置为sum,将并行度10设置为flatmap。
根据我的理解,keyby是根据不同的键将数据流划分为逻辑流\分区,假设有10000个不同的键值,那么有10000个不同的分区,那么有多少线程会处理这10000个分区?只有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");
n1bvdmb6

n1bvdmb61#

打电话的时候 setParallelism 在一个操作符上,然后它改变这个特定操作符的并行性。因此,在您的示例中,只有窗口操作符将以并行度执行 5 以及前面的 flatMap 具有默认并行性的运算符。
因此,可以为每个操作符设置不同的并行性。但是,请注意,具有不同并行性的操作符不能被链接,并且需要重新平衡(类似于洗牌)操作。
如果要为所有运算符设置并行度,则必须通过 ExecutionEnvironment#setParallelism api调用。
这个 keyBy 将输入流中的操作分区到具有并行运算符示例的分区中。这将确保具有相同键的所有元素最终位于同一分区中。所以在您的示例中,您将并行度设置为 5 ,您将得到5个分区。每个分区可以包含具有不同键的元素。

vulvrdjw

vulvrdjw2#

这里提到的执行环境级别flink程序是在执行环境的上下文中执行的。执行环境为它执行的所有操作符、数据源和数据接收器定义默认的并行性。通过显式配置操作符的并行性,可以覆盖执行环境并行性。
可以通过调用setparallelism()方法来指定执行环境的默认并行性。要以3的并行度执行所有运算符、数据源和数据接收器,请按如下所示设置执行环境的默认并行度:

final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(3);

DataStream<String> text = [...]
DataStream<Tuple2<String, Integer>> wordCounts = [...]
wordCounts.print();

env.execute("Word Count Example");

相关问题