首页 > 解决方案 > 使用侧输出共享操作员子任务状态

问题描述

我正在实现一个流式应用程序,其中一个有状态操作员正试图捕获“所有者拥有物品”关系。每个所有者键入的状态包含有关所有者和每个项目的详细信息。一个项目的所有权可能会改变,我希望能够将每个项目与其正确的所有者相关联。由于不同所有者的操作员状态可能在不同的子任务中,并且这些子任务旨在独立操作,我想知道共享状态的最佳方式是什么。我能想到的一种解决方案是从子任务的侧面输出创建一个键控数据流,并将其发送给正确的所有者并清除原始所有者的状态。本质上:

  1. 具有关于 OldOwner 的状态的子任务 1,具有 Item1、Item2、...、ItemN
  2. Subtask1 将消息写入侧输出(OldOwner、NewOwner、List[ItemsToTransfer])
  3. (可选)从关于 OldOwner 的状态中清除关于 List[ItemsToTransfer] 的状态。
  4. 从侧面输出创建数据流并将其发送回同一操作员,但可能具有关于 NewOwner 的状态的不同子任务。
  5. 通过添加新的项目集来更新 NewOwner 的状态

由于侧面输出用于非常不同的目的(日志记录等),我想知道这是否可行。与常规数据流一样,侧输出是否适用相同的容错保证?子任务中可以缓冲多少个侧面输出消息是否有限制?

另一种方法可能是获取第一个子任务的输出并将其反馈给同一操作员。从理论上讲,这两种方法都违反了 flink 作业是 DAG 的属性,尽管对于我的用例来说,永远不会有循环数据传输。

标签: apache-flinkflink-streaming

解决方案


您的提议将在拓扑中创建一个循环,因为您需要将来自侧面输出的事件发送回同一操作员的相同/不同子任务。

您实际上想要的是支持 Flink 中的多键/多状态事务。Flink 本身并没有对其提供开箱即用的支持。但是,Flink 提供了在其之上构建此类功能所需的所有工具。事实上,流式分类账正是这样做的。它允许您在 Flink 之上使用仅一次处理保证进行多状态事务。


推荐阅读