如何在Flink中构建一个1小时的重播流缓冲区?

时间:2016-05-25 16:22:16

标签: scala apache-flink flink-streaming

我想动态保留最近1小时事件的缓冲区。该缓冲区应该给我一个重播功能,以便可以在最后一小时的数据上执行查询。 在Flink中是否已经实现了一些功能?或者我需要自己构建它?

我尝试使用Window API,但似乎Flink没有给我一个向前移动的固定宽度时间窗口。

1 个答案:

答案 0 :(得分:0)

我得到了自己问题的解决方案,但我想保留问题以防万一你有更好的解决方案。因为我的确违反了函数式编程的一些优秀实践。

我的黑客如下。

            val keyedEventStream: KeyedStream[E]

            // create a stream of [hourly window as a set of events]
            val eventWindowStream = keyedEventStream.timeWindow(Time.minutes(60), Time.milliseconds(50)).fold(scala.collection.Set[E]())((set: scala.collection.Set[E], event: E) => set + event)


            // This is the hourly buffer my process logic will use
            var workWindow = scala.collection.Set[E]()
            // update the workspace window with the stream of hourly window.
            eventWindowStream.map((set: scala.collection.Set[W]) => workWindow = set)

正如您所看到的,最后一个映射的唯一目的是更新变量workWindow,这实际上是内联函数的副作用...