Apache flink 多重并行Flink应用程序中具有单一并行性的等分布运算符

Apache flink 多重并行Flink应用程序中具有单一并行性的等分布运算符,apache-flink,flink-streaming,Apache Flink,Flink Streaming,我们有一个flink应用程序,它的开始有一个map操作符。此操作的输出流使用过滤器路由到多个窗口函数。窗口函数的并行度均为1。我们形成窗口函数输出的并集,并将其传递给另一个map函数,然后将其发送到接收器 我们需要两个map函数的并行性来实现环境的并行性。这正如预期的那样发生,window函数的并行度确实为1。 我们为每个任务管理器设置了1个插槽 问题是,当我们将环境的并行度设置为大于1时,所有窗口函数任务最终只会转到第一个任务管理器。这些事件最终单独发送到此任务管理器,并最终导致瓶颈。当并行度

我们有一个flink应用程序,它的开始有一个map操作符。此操作的输出流使用过滤器路由到多个窗口函数。窗口函数的并行度均为1。我们形成窗口函数输出的并集,并将其传递给另一个map函数,然后将其发送到接收器

我们需要两个map函数的并行性来实现环境的并行性。这正如预期的那样发生,window函数的并行度确实为1。 我们为每个任务管理器设置了1个插槽


问题是,当我们将环境的并行度设置为大于1时,所有窗口函数任务最终只会转到第一个任务管理器。这些事件最终单独发送到此任务管理器,并最终导致瓶颈。当并行度>1时,是否有一种方法可以跨多个任务管理器分发窗口功能任务?执行
重新平衡()
会有帮助吗?

如果每个任务管理器只有一个插槽,并且所有窗口功能任务都在同一个任务管理器中,那么显然所有窗口功能任务都在同一个插槽中


在这种情况下,您可以使用将不同的窗口强制放到不同的插槽中,从而强制放到不同的任务管理器上。

如果每个任务管理器只有一个插槽,并且所有窗口功能任务都在同一个任务管理器中,那么显然所有窗口功能任务都在同一个插槽中


在这种情况下,您可以使用将不同的窗口强制放到不同的插槽中,从而强制放到不同的任务管理器上。

使用Flink 1.9.2/1.10.0或更高版本,您可以设置
集群。将插槽均匀分布
配置布尔值设置为
true


旁注-不要在多个流上使用过滤器来创建路由器,而是使用带有多个旁侧输出的
ProcessFunction
,每个目标窗口操作符一个。这是更有效的,因为您不需要复制数据N次,然后向下过滤到一个子集。

使用Flink 1.9.2/1.10.0或更高版本,您可以设置
群集。均匀分布插槽
配置布尔值为
true


旁注-不要在多个流上使用过滤器来创建路由器,而是使用带有多个旁侧输出的
ProcessFunction
,每个目标窗口操作符一个。这更有效,因为您不需要复制数据N次,然后再向下筛选到一个子集。

谢谢您的回复。这是否适用于任务管理器?i、 e.这是否可以确保不同的窗口功能分布在所有任务管理器的插槽中?另外,当我对窗口函数的输出进行并集时,窗口函数后面的map函数的任务会发生什么变化?在文档中,它说组名是继承的。我认为每个TM只有一个插槽,然后强制每个窗口进入自己的插槽将迫使它们进入不同的TM。我认为您应该将windows之后的映射函数放入默认的插槽共享组中。您可以使用Flink WebUI查看生成的执行图。或者使用
System.out.print(env.getExecutionPlan())
将其打印出来。谢谢,@david anderson。谢谢您的回复。这是否适用于任务管理器?i、 e.这是否可以确保不同的窗口功能分布在所有任务管理器的插槽中?另外,当我对窗口函数的输出进行并集时,窗口函数后面的map函数的任务会发生什么变化?在文档中,它说组名是继承的。我认为每个TM只有一个插槽,然后强制每个窗口进入自己的插槽将迫使它们进入不同的TM。我认为您应该将windows之后的映射函数放入默认的插槽共享组中。您可以使用Flink WebUI查看生成的执行图。或者使用
System.out.print(env.getExecutionPlan())
将其打印出来。谢谢@david anderson。每个任务管理器都有一个插槽吗?根据上面的描述,听起来每个TM有多个插槽。每个任务管理器是否有一个插槽?根据上面的描述,听起来每个TM有多个插槽。