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

How to force Apache Flink using a modified operator placement?

Apache Flink 将其运算符分配到 JobManager(从站)上可用的空闲插槽上。如 documentation 中所述,可以为执行中包含的每个运算符设置 SlotSharingGroup。这意味着,两个运算符可以共享同一个插槽,稍后执行它们。

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

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

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

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

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

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

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