"我有一个数据流,其中事件的顺序很重要。时间特征设置为EventTime,因为传入记录中包含时间戳。
为了保证订购,我将程序的并行性设置为1.当我的程序变得更复杂时,这会成为一个问题吗?
如果我理解正确,我需要为我的事件分配水印,如果我想保持按时间戳排序的流。这很简单。但我正在读,即使这不保证秩序?稍后,我想对该流进行有状态计算。因此,为此,我使用FlatMap函数,该函数需要对流进行键控。但是,如果我键入流,则订单会再次丢失。 AFAIK这是因为不同的流分区,这是由并行性“引起的”。
我有两个问题:
我需要并行吗?我需要考虑哪些因素?
我将如何实现上述“有序并行”?"
"需要考虑以下几点:
将整个作业的并行度设置为1将阻止扩展应用程序,这将影响性能。这实际上是否重要取决于你的应用要求,但它肯定是限制,可能是一个问题。
如果您你提到的聚合要在所有事件记录中全局计算,那么并行操作将需要并行进行一些预聚合。但是在这种情况下,你必须在作业图的后期阶段将并行度降低到1,以便产生最终(全局)结果。
另一方面,如果要为某个键的每个值独立计算这些聚合,则考虑键入流并将该分区用作并行操作的基础是有意义的。
你提到的所有操作都需要一些状态,无论是计算最大值,最小值,平均值,还是正常运行时间和停机时间。例如,如果不记住到目前为止遇到的最大值,则无法计算最大值。
如果我正确理解Flink的NiFi源连接器是如何工作的,那么如果源并行运行,则键入流将导致无序事件。
但是,你提到的所有操作都不需要按顺序传送数据。在无序流上计算正常运行时间(和停机时间)将需要一些缓冲 - 这些操作需要等待无序数据到达它们才能产生结果 - 但这肯定是可行的。这正是水印的用途;它们定义了等待无序数据的时间。你可以在ProcessFunction中使用事件时间计时器来安排在处理完所有早期事件时调用onTimer回调。
你始终可以对键控流进行排序。这是一个例子。
使用Flink的CEP库(对其输入进行排序,顺便说一句),运行时间/停机时间计算应该很容易。
更新:
确实,在将ProcessFunction应用于键控流之后,流不再是键控的。但在这种情况下,您可以安全地使用reinterpretAsKeyedStream来通知Flink流仍然是键控的。
对于CEP,此库代表你使用状态,从而可以更轻松地开发需要对模式做出反应的应用程序。"
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。