Apache flink 使用边输出共享运算符子任务状态

Apache flink 使用边输出共享运算符子任务状态,apache-flink,flink-streaming,Apache Flink,Flink Streaming,我正在实现一个流式应用程序,其中一个有状态的操作员正在尝试捕获“owner has items”关系。每个所有者键入的状态由所有者和每个项目的详细信息组成。项目的所有权可以更改,我希望能够将每个项目与其正确的所有者关联。由于不同所有者的操作员状态可能位于不同的子任务中,并且这些子任务旨在独立运行,因此我想知道共享状态的最佳方式是什么。我能够想到的一个解决方案是从子任务的侧面输出创建一个键控数据流,并将其发送给正确的所有者,然后从原始所有者清除状态。基本上: 子任务K1,状态为关于具有Item1、

我正在实现一个流式应用程序,其中一个有状态的操作员正在尝试捕获“owner has items”关系。每个所有者键入的状态由所有者和每个项目的详细信息组成。项目的所有权可以更改,我希望能够将每个项目与其正确的所有者关联。由于不同所有者的操作员状态可能位于不同的子任务中,并且这些子任务旨在独立运行,因此我想知道共享状态的最佳方式是什么。我能够想到的一个解决方案是从子任务的侧面输出创建一个键控数据流,并将其发送给正确的所有者,然后从原始所有者清除状态。基本上:

  • 子任务K1,状态为关于具有Item1、Item2、…、ItemN的OldOwner
  • Subtask1将消息写入到端输出(OldOwner、NewOwner、List[ItemsToTransfer])
  • (可选)从关于OldOwner的状态中清除关于列表[ItemsToTransfer]的状态
  • 从侧面输出创建一个数据流,并将其发送回同一个操作符,但可能是具有NewOwner状态的不同子任务
  • 通过添加新的项目集更新NewOwner的状态
  • 由于侧输出的目的非常不同(日志记录等),我想知道这是否可行。与常规数据流相同的容错保证是否适用于侧输出?子任务中可以缓冲多少边输出消息有限制吗


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

    您的方案将在拓扑中创建一个循环,因为您需要将事件从侧面输出发送回同一操作符的相同/不同子任务

    实际上,您需要的是在Flink中支持多键/多状态事务。Flink本身并没有现成的支持。不过,Flink提供了在其上构建此类功能所需的所有工具。事实上,政府正是这样做的。它允许您在Flink的基础上使用一次处理保证来执行多状态事务