如何使用修改后的运算符放置强制 Apache Flink?

问题描述

Apache Flink 将其操作符分布在 JobManager(从属)上的可用空闲插槽上。如 documentation 中所述,可以为执行中包含的每个运算符设置 SlotSharingGroup。这意味着,两个操作符可以共享同一个槽,然后在那里执行。

遗憾的是,此选项仅允许共享同一组,但不允许将流操作分配给特定插槽。

所以我的问题是:将流操作符手动分配给 Apache Flink 中的特定插槽/工作器的最佳(或至少一种)方法是什么?

解决方法

您可以通过 (disableChaining()) 禁用链接并启动一个新链以通过 (startNewChain()) 将其与其他人隔离。您可以使用 Flink Plan Visualizer 来查看您的计划是否有孤立的运营商。这些修饰符在操作符之后应用。示例:

  .map(...).startNewChain().slotSharingGroup("exceptional")
  // or
  .filter(...).startNewChain().slotSharingGroup("default")

为什么需要隔离它?嗯……在任何链的末尾,flink 都会做一个检查点(如果启用)并且检查点应该被确认(持久化/序列化)。否则系统将回滚它并重新开始该过程。为此 Flink 需要事先确保它有足够的插槽。在您的情况下,有足够的 exceptional 插槽。如果没有,整个流将处于非活动状态。因此,您不能告诉 flink,对于操作符 x,您只需要使用插槽 X,而对于操作符 Z,您只需要使用 Y,因为 Flink 只是为检查点(或直接到下一个操作符)产生中间结果的计算机能力。

,

正在朝这个方向进行开发工作。特别是,请参阅 FLIP-56: Dynamic Slot Allocation。我不知道这是否足以满足您的目标,但至少它带来的重构和扩展应该会有所帮助。

有关详细信息,请参阅 FLINK-14187 和相关问题。