在Flink ConnectedStream中处理“状态刷新”

时间:2019-01-28 13:30:45

标签: apache-flink flink-streaming

我们正在构建一个具有两个流的应用程序:

  1. 大量消息流
  2. 大量静态流(源自我们周围的一些镶木地板文件),我们将其馈入Flink只是为了使该数据集进入保存状态

我们要连接两个流以获取共享状态,以便第一个流可以使用第二个状态进行充实。

每天大约更新镶木地板文件(第二流的来源),这将需要我们清除第二流的状态并重建(可能需要2分钟左右)。

问题是,我们可以在此过程运行时阻止/延迟来自第一流的消息吗?

谢谢。

2 个答案:

答案 0 :(得分:1)

不幸的是,目前没有直接/简便的方法可以将一个流阻止在另一个流上。典型的解决方案是在加载(或重新加载)浓缩流时缓冲摄取流。

您可以尝试的一种方法是根据某些外部触发器将摄取流包装到一个知道何时不生成数据的自定义SourceFunction中(这与您知道自己拥有实木复合地板数据重新加载。

答案 1 :(得分:1)

听起来有点像您的案例,类似于Flip-23,它探讨了Apache Flink中的模型服务。

我认为这全都归结为如何(以及是否)锁定静态流:

  • 如果以与快速数据相似的方式对其进行键控,则可以对两个流进行键控,将它们连接起来,然后可以访问键控的上下文。
  • 如果静态流事件不是以类似的方式键入的,则您应该考虑发出控制事件,该事件将触发来自外部源(例如s3)的那些静态文件的刷新。说起来容易做起来难,因为没有简单的方法可以保证快速流的所有并行实例都将获得控制事件。 您可以将ListState用作缓冲区,但是如何访问它取决于数据的形状。

如果您分享了有关数据形状的更多信息(例如,您是否正在加入钥匙?您只是在服务模型还是其他?),这可能会有所帮助。