Kafka流和窗口以计算时间窗口

时间:2018-05-02 10:39:05

标签: java apache-kafka apache-kafka-streams

我是Stackoverflow的新手,请原谅我,如果问题很严重的话。任何帮助/灵感都非常感谢!

我使用Kafka流来过滤传入数据到我的数据库。传入的消息看起来像{"ID":"X","time":"HH:MM"}和一些其他参数,在这种情况下无关紧要。我设法让一个运行的java应用程序从主题读取并打印出传入的消息。现在我想要做的是使用KTables(?)对具有相同ID的传入消息进行分组,然后使用会话窗口在时隙中对表进行分组。我想在时间轴上连续运行X分钟的时间窗口。

第一件事当然是让KTable运行来计算具有相同ID的传入消息。我想做的事情应该是这样的:

ID       Count
X          1
Y          3
Z          1

持续不断更新,因此从表中删除了带有过时时间戳的邮件。

我不是百分百肯定,但我认为我想要的是KTables而不是KStreams,我是对的吗?如果这是实现我想要的结果的正确方法,我如何实现滑动窗口?

这是我现在使用的代码。它只从主题中读取并打印传入的消息。

private static List<String> printEvent(String o) {
    System.out.println(o);
    return Arrays.asList(o);
}

final StreamsBuilder builder = new StreamsBuilder();
    builder.<String, String>stream(srcTopic)
    .flatMapValues(value -> printEvent(value));

我想知道我必须添加什么才能实现上述所需的输出,以及我将其放在我的代码中的位置。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

是的,您需要Ktable和滑动窗口,我还建议您查看watermark feature,以处理延迟发送消息。 Example

KTable<Windowed<Key>, Value> oneMinuteWindowed = yourKStream

.groupByKey()

.reduce(/*your adder*/, TimeWindows.of(60*1000, 60*1000), "store1m");
        //where your adder can be as simple as (val, agg) -> agg + val
        //for primitive types or as complex as you need