【问题标题】:Equally distribute operators with single parallelism in a multi-parallel Flink application在多并行 Flink 应用程序中平均分配具有单一并行性的算子
【发布时间】:2020-08-07 18:09:09
【问题描述】:

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

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

问题是,当我们将环境的并行度设置为大于 1 时,所有窗口函数任务最终都只会转到第一个任务管理器。事件最终会单独转到这个任务管理器并最终导致瓶颈.当我们的并行度 > 1 时,有没有办法在多个任务管理器之间分配窗口函数任务? rebalance() 会有帮助吗?

【问题讨论】:

  • 每个任务管理器都有一个插槽吗?从上面的描述来看,听起来每个 TM 有多个插槽。

标签: apache-flink flink-streaming


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回复。这是否适用于任务管理器?即这会确保不同的窗口功能分布在所有任务管理器的插槽中吗?另外,当我合并窗口函数的输出时,跟随窗口函数的映射函数的任务会发生什么?在文档中,它说组名是继承的。
  • 我每个 TM 只有一个插槽,然后强制每个窗口进入自己的插槽将强制它们进入不同的 TM。我想你会想把窗口后面的地图功能放到默认的插槽共享组中。
  • 您可以使用 Flink WebUI 查看生成的执行图是什么样的。或者使用System.out.print(env.getExecutionPlan())打印出来。
  • 谢谢@david anderson。
【解决方案2】:

使用 Flink 1.9.2/1.10.0 或更高版本,您可以将 cluster.evenly-spread-out-slots 配置布尔值设置为 true

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

【讨论】:

    猜你喜欢
    • 2011-04-27
    • 2020-10-21
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多