在Flink流中使用状态和窗口(时间)之间的差异

时间:2016-01-04 17:09:24

标签: apache-flink flink-streaming

我们想说我们要计算项目的总和和平均值, 并且可以使用windowswindows(时间)。

使用states的示例 - https://ci.apache.org/projects/flink/flink-docs-release-0.10/apis/streaming_guide.html#example-program

使用$('#uniqueId')的示例 - https://github.com/dataArtisans/flink-training-exercises/blob/master/src/main/java/com/dataartisans/flinktraining/exercises/datastream_java/ride_speed/RideSpeed.java

我可以问一下做出决定的理由是什么?我可以推断,如果数据非常不规则地到达(50%来自定义的窗口长度而另外50%不是),窗口方法的结果更偏向(因为50%的事件被丢弃)?

另一方面,在处理状态时,我们是否花费更多时间检查和更新状态?

1 个答案:

答案 0 :(得分:1)

首先,它取决于你的语义......这两个例子使用不同的语义,因此无法直接比较。此外,Windows也在内部处理状态。总的来说很难说方法是更好的方法。

由于Flink的窗口语义非常丰富,我建议使用windows。如果你不能用windows表达你的语义,使用state可以是一个很好的选择。使用Windows,还有一个额外的好处,即状态处理 - 很难正确完成 - 自动完成。

该决定绝对与您的数据到达率无关。 Flink不会删除任何数据。如果您使用事件时间(而不是使用处理时间),那么结果将与数据到达率无关。

相关问题