如何在Flink中实现键控窗口超时?

时间:2018-12-05 16:14:41

标签: apache-flink

我有一个按键事件进入一个流,该事件我想按键累积,直到超时(例如5分钟),然后处理直到该点为止的事件(并忽略该键之后的所有内容) ,但首先要注意)。

我是Flink的新手,但从概念上讲,我认为我需要类似下面的代码。

    DataStream<Tuple2<String, String>> dataStream = see
            .socketTextStream("localhost", 9999)
            .flatMap(new Splitter())
            .keyBy(0)
            .window(GlobalWindows.create())
            .trigger(ProcessingTimeTrigger.create()) // how do I set the timeout value?
            .fold(new Tuple2<>("", ""), new FoldFunction<Tuple2<String, String>, Tuple2<String, String>>() {
                public Tuple2<String, String> fold(Tuple2<String, String> agg, Tuple2<String, String> elem) {
                    if ( agg.f0.isEmpty()) {
                        agg.f0 = elem.f0;
                    }
                    if ( agg.f1.isEmpty()) {
                        agg.f1 = elem.f1;
                    } else {
                        agg.f1 = agg.f1 + "; " + elem.f1;
                    }
                    return agg;
                }
            });

此代码无法编译,因为ProcessingTimeTrigger需要一个TimeWindow,而GlobalWindow不是TimeWindow。所以...

如何在Flink中完成键控窗口超时?

1 个答案:

答案 0 :(得分:0)

如果您使用output$courseData = renderTable(rownames=TRUE, { data = mtcars c1 = input$course1 c2 = input$course2 tbl = as.data.frame.matrix(table(data[[c1]], data[[c2]])) tbl}) } 来解决这个问题,那么您将会轻松得多。

我建议在KeyedProcessFunction的open()方法中建立一个键控KeyedProcessFunction项。在processElement()方法中,如果列表为空,则当您希望窗口结束时,设置要触发的处理时间计时器(相对于当前时间的每个按键计时器)。然后将传入事件添加到列表中。

当计时器触发时,将调用onTimer()方法,您可以遍历列表,产生结果并清除列表。

要安排每个键仅执行一次所有这些操作,请在KeyedProcessFunction中添加ListState以跟踪此情况。 (请注意,如果您的密钥空间是无限的,则应考虑一种最终使过时密钥的状态过期的策略。)

文档描述了如何使用Process Functionshow to work with state。您可以在Flink培训网站上找到其他示例,例如this exercise