我们正在尝试构建一个用例,其中来自流的数据通过计算公式运行,但公式本身也应该(很少)可更新。
通过阅读文档,在我看来,Flink 广播状态非常适合这种情况。
作为实验,我构建了一个简化版本:假设我有一个整数流,以及第二个包含这些整数的乘法因子的流(我可以随意发送值)。第二个流的频率非常低,事件之间很可能是几天或几周。
目前,这两者都被实现为简单的套接字服务器,最终产品将使用 Kafka。
在我的示例应用程序中,这一切都有效,但我留下了一个问题:当系统启动并且广播流上还没有发生任何事情时会发生什么?我可以从哪里获得默认(或上次使用的)系数?在我的示例中,我现在通过硬编码一个值来解决它,但这不是我可以使用的东西。
在我的实验项目中,我对此感到有点困惑,因为 {processElement} 只能获得只读广播状态,但是processBroadcastElement
在有可能需要很长时间的更新之前不会被调用。
我的计划是存储数据库中使用的公式,并在作业(重新)开始时以某种方式读取它,但我还没有找到一种方法来完成这项工作。欢迎来自更多知识渊博的人的任何建议,这是我的第一个 Flink 项目,所以我正在努力寻找解决办法。
工作示例在这里:https://github.com/tonvanbart/flink-broadcast-example/tree/mapstate-attemptFlink代码在类中BroadcastState
.
提前致谢。
如果系统从检查点/保存点重新启动,那么您就拥有了广播的最后一个因素(通过状态),对吧?所以我认为问题在于它最初启动时要做什么。
如果是这样,那么这是您正在使用的模式的常见问题,您实际上希望阻止整数流,直到从广播流中获取初始值。
目前,常见的解决方案是在运算符中缓冲整数流(使用状态),直到获得初始值,但这可能会导致无界状态,具体取决于整数进入的速度以及需要等待的时间。
您可以尝试的其他方法是包装您的整数源(使其成为委托)并且在您知道某些内容已被广播之前不要发出任何值。例如。使广播的内容进入可查询状态,并定期检查直到该状态存在。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)