Apache flink Flink中算子并行性的几个难题

Apache flink Flink中算子并行性的几个难题,apache-flink,flink-streaming,Apache Flink,Flink Streaming,我刚刚获得了以下并行性示例,并提出了一些相关问题: setParallelism(5)是将Parallelism 5设置为仅求和还是同时设置为flatMap和sum 我们是否可以将不同的并行度分别设置为不同的运算符,例如flatMap和sum?例如将并行度5设置为sum,将并行度10设置为flatMap 根据我的理解,keyBy是基于不同的键将数据流划分为逻辑流\分区,假设有10000个不同的键值,那么有10000个不同的分区,那么有多少线程将处理10000个分区?只有5个线程?如果我们不设置s

我刚刚获得了以下并行性示例,并提出了一些相关问题:

  • setParallelism(5)是将Parallelism 5设置为仅求和还是同时设置为flatMap和sum

  • 我们是否可以将不同的并行度分别设置为不同的运算符,例如flatMap和sum?例如将并行度5设置为sum,将并行度10设置为flatMap

  • 根据我的理解,keyBy是基于不同的键将数据流划分为逻辑流\分区,假设有10000个不同的键值,那么有10000个不同的分区,那么有多少线程将处理10000个分区?只有5个线程?如果我们不设置setParallelism(5)呢

  • 最终流执行环境环境=
    StreamExecutionEnvironment.getExecutionEnvironment();
    数据流文本=[…]
    DataStream wordCounts=文本
    .flatMap(新的LineSplitter())
    .keyBy(0)
    .时间窗口(时间.秒(5))
    .sum(1)和(5);
    wordCounts.print();
    env.execute(“字数示例”);
    
    在运算符上调用
    setParallelism
    时,它会更改此特定运算符的并行性。因此,在您的示例中,只有窗口操作符将以
    5
    的并行度执行,前面的
    flatMap
    操作符将以默认的并行度执行

    因此,可以为每个操作符设置不同的并行度。但是,请注意,具有不同并行性的运算符不能被链接,并且需要重新平衡(类似于洗牌)操作

    如果要为所有运算符设置并行性,则必须通过
    ExecutionEnvironment#setParallelism
    API调用进行设置


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

    执行环境级别 正如这里提到的,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");
    
    final StreamExecutionEnvironment env=StreamExecutionEnvironment.getExecutionEnvironment();
    环境署署长(3);
    数据流文本=[…]
    数据流字数=[…]
    wordCounts.print();
    env.execute(“字数示例”);
    
    如果我将Parallelism设置为5,那么最终会有5个分区,那么如果我将MaxParallelism设置为5,那么会有多少个分区?这是否意味着分区多于5个?还有为什么我们同时有setParallelism和setMaxParallelism?我的意思是什么时候我们应该使用setParallelism,什么时候我们应该使用setMaxParallelism?这个并行定义了一个操作符的并行实例的数量。最大并行度定义了可将作业扩展到的最大并行度。如果您获取一个保存点并使用它以更高的并行度重新启动作业,这一点很重要。对于我上面的示例,假设我删除了.keyBy(0),但保留了.setParallelism(5),结果仍然有5个分区,不同之处在于相同的键最终会出现不同的分区。那么窗口运算符和的并行度是多少?即使使用setParallelism(5),它也会变成1?根据以下官方文件,非钥匙窗的平行度为1,或者仍然是5,因为setParallelism(5)可以覆盖非键控窗口的并行度1?对于非键控窗口,即使您尝试将其设置为其他值,并行度也强制为
    1
    。原因是您无法分发未对齐的窗口。