在带有Kafka流的窗口中处理项目

时间:2019-11-20 10:09:25

标签: scala apache-kafka apache-kafka-streams

我正在尝试使用kafka流在滑动窗口中处理一些事件,但我认为我不了解kafka流的一些详细信息,因此我无法做我想做的事。

我所拥有的:

  • 使用键/值(例如,Int,Person)输入事件的主题

我想要什么:

  • 在10分钟的滑动窗口中阅读这些事件
  • 处理滑动窗口中的每个元素
  • 过滤并计算一些元素,将事件触发到另一个卡夫卡 主题(例如,如果检测到错误的值)

为简单起见:在10分钟的滑动窗口中获取所有事件,对其进行foreach,在该窗口的上下文中计算一些统计信息/事件,转到下一个窗口...

我尝试了什么: 我试图将Stream和处理器API混合在一起:

    val streamBuilder = new StreamsBuilder()
    streamBuilder.stream[Int, Person](topic)
      .groupBy((_, value) => PersonWrapper(value.id, value.name))
      .windowedBy(TimeWindows.of(10 * 60 * 1000L).advanceBy(1 * 60 * 1000L))
// now I have a window of (PersonWrapper, Person) right ?
    streamBuilder.build().addProcessor(....)

现在,我将为该拓扑添加一个处理器,以处理滑动窗口的每个事件。 我不明白什么是TimeWindowStream,为什么我们应该有一个KGroupedStream在事件上应用窗口。如果有人可以启发我介绍Kafka流以及我正在尝试做的事情。

1 个答案:

答案 0 :(得分:1)

您已阅读文档:https://docs.confluent.io/current/streams/developer-guide/dsl-api.html#windowing

  1. 开窗是分组的一种特殊形式(基于时间分组)
  2. 在Kafka Streams中计算聚合总是需要分组
  3. 在具有分组和窗口化的流之后,您可以调用aggregate()进行实际处理(无需手动附加Processor;对aggregate()的调用将隐式添加一个{{1 }}给您)。
  

顺便说一句:Kafka Streams并不真正支持聚合的“滑动窗口”。您定义的窗口称为跳跃窗口

ProcessorKGroupedStream基本上只是帮助程序类,并且是可以流畅地设计API的中间表示形式。

该教程也是入门的好方法:https://docs.confluent.io/current/streams/quickstart.html

您还应该查看示例:https://github.com/confluentinc/kafka-streams-examples

相关问题