在 Flink 流中使用状态和 windows(time) 之间的区别

Differences between working with states and windows(time) in Flink streaming

假设我们要计算项目的总和和平均值, 并且可以使用 stateswindows(time)。

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

使用 states 的示例 - https://github.com/dataArtisans/flink-training-exercises/blob/master/src/main/java/com/dataartisans/flinktraining/exercises/datastream_java/ride_speed/RideSpeed.java

请问做出决定的原因是什么?我可以推断如果数据到达非常不规则(50% 到达定义的 window 长度而其他 50% 没有),window 方法的结果更偏向(因为 50 % 事件被丢弃)?

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

首先,这取决于您的语义...这两个示例使用不同的语义,因此不能直接进行比较。此外,windows 也在内部处理状态。很难说with approach哪个好。

由于Flink的window语义非常丰富,建议使用windows。如果你不能用 windows 表达你的语义,使用状态可能是一个很好的选择。使用 windows 具有额外的优势,即状态处理——很难正确完成——会自动为您完成。

决定完全独立于您的数据到达率。 Flink 不会丢弃任何数据。如果你使用事件时间(而不是处理时间),你的结果将是相同的,与数据到达率无关。