现代流处理引擎倾向于关注大数据的并行处理。当从整个数据集的整个集合或子集(过滤(上的聚合计算期望的结果时,这是非常好的。与此相反,我需要按顺序处理数据,从一行到下一行的更改具有意义,并更改接下来必须做的事情。所有数据都是时间序列数据。例如,想象一个视频游戏根据当前情况和玩家的输入生成结果。Spark通过例如mapGroupsWithState((允许这样做,但我相信这不是它的设计目的,因为这种情况不需要在集群中分发数据来进行处理(因为数据需要按顺序处理,所以它应该受益于将状态保持在一个位置,并通过接近该状态的单个处理点传递所有数据(。我看过flink,但没有发现任何与逐帧流处理有关的内容。
有什么办法可以解决这类问题吗?我不想重新发明轮子。
谢谢。
您可以使用Flink进行每次事件的时间模式匹配和时间序列分析。
为了获得一个更易于使用、更高级别的API,请查看使用Flink SQL进行模式识别的文档。有关更强大的模式识别库,请参阅Flink的CEP库的文档。
如果您更喜欢直接使用有状态、每次事件的流处理的较低级别构建块,那么在Flink中最好从KeyedProcessFunction
开始。
使用您分析视频游戏中事件流的示例,如果您想单独(并行(处理来自不同玩家的流,您可以这样做:
events
.keyBy(event -> event.playerId)
.process(new MyKeyedProcessFunction())
...
但是如果你不能对流进行有意义的键分区,那么你可以这样做:
events
.keyBy("a constant")
.process(new MyKeyedProcessFunction())
即使不能利用并行性,您也可能希望使用KeyedStream
的原因是Flink的键控状态和计时器比非键控状态更容易工作,也更灵活。
有关更多信息,请参阅流程功能文档。