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
最终流执行环境环境=
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
。原因是您无法分发未对齐的窗口。