问题描述
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 和相关问题。