Java ApacheFlink:具有并行性的有序时间戳
我有一个数据流,其中事件的顺序很重要。时间特性设置为EventTime,因为传入记录中有时间戳 为了保证排序,我将程序的并行度设置为1。当我的程序变得更复杂时,这会成为性能方面的问题吗 如果我理解正确,我需要为我的事件分配水印,如果我想让流按时间戳排序的话。这很简单。但我读到即使这样也不能保证秩序?稍后,我想对该流进行有状态计算。因此,我使用了一个FlatMap函数,它需要对流进行键控。但如果我对流进行键控,则顺序将再次丢失。AFAIK这是因为不同的流分区,它们是由并行性“引起”的 我有两个问题:Java ApacheFlink:具有并行性的有序时间戳,java,apache-flink,Java,Apache Flink,我有一个数据流,其中事件的顺序很重要。时间特性设置为EventTime,因为传入记录中有时间戳 为了保证排序,我将程序的并行度设置为1。当我的程序变得更复杂时,这会成为性能方面的问题吗 如果我理解正确,我需要为我的事件分配水印,如果我想让流按时间戳排序的话。这很简单。但我读到即使这样也不能保证秩序?稍后,我想对该流进行有状态计算。因此,我使用了一个FlatMap函数,它需要对流进行键控。但如果我对流进行键控,则顺序将再次丢失。AFAIK这是因为不同的流分区,它们是由并行性“引起”的 我有两个问题
- 我需要并行性吗?我需要考虑哪些因素?
- 我如何用上面描述的实现“有序并行”
另一方面,对于每个键的每个值,都要独立地计算这些集合,那么考虑对流进行键控并使用该分区作为并行操作的基础是有意义的。p> 您提到的所有操作都需要某种状态,无论是计算最大值、最小值、平均值还是正常运行时间和停机时间。例如,如果不记住目前遇到的最大值,就无法计算最大值
如果我正确理解Flink的NiFi源连接器的工作原理,那么如果源并行运行,对流进行键控将导致无序事件 但是,您提到的任何操作都不要求按顺序交付数据。在无序流上计算正常运行时间(和停机时间)需要一些缓冲——这些操作需要等待无序数据到达后才能产生结果——但这当然是可行的。这正是水印的用途;它们定义了无序数据的等待时间。您可以在ProcessFunction中使用事件时间计时器来安排在处理所有早期事件后调用onTimer回调 您始终可以对键控流进行排序。给你 正常运行时间/停机时间的计算应该很容易使用Flink的CEP库(顺便说一句,它对输入进行排序) 更新: 确实,在将ProcessFunction应用于键控流之后,流不再被键控。但在这种情况下,您可以安全地使用通知Flink流仍处于键控状态至于CEP,这个库代表您使用state,这使得开发需要对模式做出反应的应用程序更加容易 解释所有的可能性有点过分,所以如果你提供更多的上下文,就更容易做出回应。您从何处获取这些数据?在多大程度上是从源头订购的?您想用它做什么,为什么需要对流进行排序(我假设是按时间戳排序)?是否需要全局排序,或者对每个键进行排序就足够了?@DavidAnderson我从NiFi获取JSON格式的数据,我通过映射函数将其解析为POJO。数据是实时数据,因此,使用NiFi排队,它是按时间戳排序的。我想对数据进行计算,例如最大值、最小值、平均值。我还想进行有状态计算,比如计算机器运行/未运行的时间。为此,我将数据的时间戳输入两个数组(一个用于生产时间,一个用于非生产时间),并分别从最新的时间戳中减去最早的时间戳。(非)生产由机器速度检测。感谢您提供详尽的答案。不过,我还有一些问题。我同意我所有的操作都需要状态,但如果我用KeyedProcessingFunction对我的keyed数据流进行排序,它就不再是keyed了,对吗?那么我应该如何使用状态呢?我不能在未设置关键帧的流上使用FlatMap。您提到使用Flink的CEP库可以解决正常运行/停机问题,但根据我的研究,我发现CEP不支持状态,至少我没有发现任何迹象表明它支持状态。如果这听起来很愚蠢,我很抱歉,但到目前为止,我很难学习Flink。我已经更新了我的答案。如果你想了解某个特定主题的更多细节,我建议你问一个或多个额外的、更具体的问题,在每种情况下描述你尝试过的内容,并指出你仍然被困的地方。