我们正在构建一个具有两个流的应用程序:
- 高容量消息流
- 一个大的静态流(源自我们周围的一些镶木地板文件),我们将其输入到 Flink 中,只是为了让该数据集进入保存状态
我们希望连接两个流以获得共享状态,以便第一个流可以使用第二个状态进行扩充。
每天左右,拼花地板文件(第二个流的源)都会更新,这将需要我们清除第二个流的状态并重建它(可能需要大约 2 分钟)。
问题是,我们可以在此过程运行时阻止/延迟来自第一个流的消息吗?
谢谢。
不幸的是,目前没有直接/简单的方法来阻止另一个流上的一个流。典型的解决方案是在加载(或重新加载)扩充流时缓冲引入流。
您可以尝试的一种方法是将采集流包装在自定义SourceFunction
中,该根据某些外部触发器(与知道要重新加载的 Parquet 数据时使用的信号相同)知道何时不生成数据。
有点像你的情况类似于 Flip-23,它探索了 Apache Flink 中的模型服务。
我认为这一切都归结为静态流的键控方式(以及是否):
- 如果它的键控方式与快速数据类似,则可以对两个流进行键控,连接它们,然后访问键控上下文。
- 如果静态流事件没有以类似的方式进行键控,也许您应该考虑发出控制事件,这将触发从外部源(例如 S3)刷新这些静态文件。这说起来容易做起来难,因为没有简单的方法可以保证快速流的所有并行实例都将获得控制事件。您可以使用
ListState
作为缓冲区,但如何访问它取决于数据的形状。
如果您分享了有关数据形状的更多信息(例如,您是否在键上加入?您只是在为模型服务吗?其他?),这可能会有所帮助。