Flink广播状态如何初始化?

时间:2019-02-18 13:14:05

标签: apache-flink broadcast flink-streaming

我们正在尝试构建一个用例,其中流中的数据通过计算公式运行,但是公式本身也应该(很少)是可更新的。 通过阅读文档,在我看来Flink广播状态自然适合这种情况。

作为一个实验,我构建了一个简化的版本:假设我有一个整数流,第二个流包含这些整数的乘法因子(我可以随意发送值)。第二个流的频率非常低,很容易在事件之间间隔几天或几周。 目前,这两个都被实现为简单的套接字服务器,最终产品将使用Kafka。

在我的示例应用程序中,这一切正常,但是我有一个问题:当系统启动并且广播流还没有发生任何事情时会发生什么?从哪里可以获得默认(或上次使用)的因子?在我的示例中,我已经通过对值进行硬编码解决了它,但是那是我无法使用的。

在我的实验项目中,我对此感到有些困惑,因为{processElement}仅获得只读广播状态,但是直到进行更新(可能需要很长时间)之后,processBroadcastElement才会被调用。 我的计划是将使用的公式存储在数据库中,并在作业(重新)开始时以某种方式读取该公式,但是我还没有找到一种使这项工作有效的方法。来自知识渊博的人们的任何建议都将受到欢迎,这是我的第一个Flink项目,所以我试图找到解决方法。

工作示例在这里: https://github.com/tonvanbart/flink-broadcast-example/tree/mapstate-attempt Flink代码在BroadcastState类中。

谢谢。

1 个答案:

答案 0 :(得分:0)

如果系统正在从检查点/保存点重新启动,那么您拥有(通过状态)广播的最后一个因素,对吗?因此,我认为问题在于最初启动时该怎么办。

如果是这样,那么这就是您使用的模式的一个常见问题,您实际上要阻止整数流,直到从广播流中获得初始值为止。

现在,常见的解决方案是将整数流缓冲在操作符中(使用状态),直到获得该初始值为止,但这可能会导致无界状态,具体取决于整数的输入速度和所需的时间。等待。

您可以尝试的其他方法是包装您的整数源(使其成为委托),并且在您知道已广播某些内容之前不发出任何值。例如。使广播的内容变为可查询状态,并进行定期检查,直到该状态存在为止。