我们试图构建一个用例,其中来自流的数据通过计算公式运行,但是公式本身也应该(很少)是可更新的。通过阅读文档,在我看来,Flink广播状态将是一个自然适合这样的情况。
作为一个实验,我构建了一个简化的版本:假设我有一个整数流,第二个流包含这些整数的乘法因子(我可以随意发送值)。第二个流的频率很低,很容易在几天或几周之间的事件。目前,这两个都实现为简单的套接字服务器,最终产品将使用kafka。
在我的示例应用程序中,这一切都是可行的,但留给我一个问题:当系统启动而广播流上还没有发生任何事情时会发生什么?我可以从哪里获得默认(或最后使用)因子?在我的例子中,我现在已经通过硬编码一个值来解决这个问题,但是这不是我可以使用的东西。
在我的实验项目中,我对此有点困惑,因为{processelement}只获得只读广播状态,但是 processBroadcastElement
在有可能需要很长时间的更新之前不会调用。我的计划是将使用的公式存储在数据库中,然后在作业(重新)开始时以某种方式读入,但我还没有找到一种方法来实现这一点。任何来自知识渊博的人的建议都会受到欢迎,这是我的第一个flink项目,所以我正在努力找到自己的方法。
工作示例如下:https://github.com/tonvanbart/flink-broadcast-example/tree/mapstate-attempt Flink密码在课堂上 BroadcastState
.
提前谢谢。
1条答案
按热度按时间gk7wooem1#
如果系统是从检查点/保存点重新启动的,那么您有最后一个广播的因素(通过状态),对吗?所以我想问题是它刚启动时该怎么办。
如果是这样的话,那么这就是您所使用的模式的一个常见问题,您需要有效地阻止整数流,直到您从广播流中获得初始值。
现在常见的解决方案是在操作符中缓冲整数流(使用state),直到获得初始值为止,但这可能会导致无界状态,具体取决于整数输入的速度和等待的时间。
您可以尝试的另一种方法是 Package 整数源(使其成为委托),并且在知道已广播某些内容之前不要发出任何值。e、 g.使广播内容进入可查询状态,并定期检查,直到状态存在。