【发布时间】:2017-02-01 08:46:06
【问题描述】:
我正在开发一个从 Kafka 读取事件的 Flink 流处理器。这些事件由其中一个字段键入,并且应该在一段时间内窗口化,然后再减少和输出。我的处理器使用事件时间作为时间特征,因此从它消耗的事件中读取时间戳。这是它目前的样子:
source
.map(new MapEvent())
.assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor<Event>(Time.seconds(10)) {
@Override public long extractTimestamp(Event event) {
return event.getTimestamp();
}
})
.keyBy(new KeySelector())
.timeWindow(Time.minutes(1))
.reduce(new EventReducer())
.map(new MapToResult());
我对这些事件的了解如下:
- 它们的事件时间是无序的。
- 延迟到达是可能的,因此事件到达的时间可能比时间戳所说的要晚得多。为了便于使用,假设我知道,最晚可能的到达时间为 20 秒。
- 我希望我的活动在 Flink 将它们转发到下面的 reduce 运算符之前恰好窗口化一分钟。
最后,这是我的问题:
- 鉴于我之前描述的用例,
BoundedOutOfOrdernessTimestampExtractor是一个不错的选择吗?我已经阅读了文档,看到了AssignerWithPunctuatedWatermarks和其他可用于创建水印的预定义分配器,但不完全理解,如果这些对我来说会更好。 -
assignTimestampsAndWatermarks()如何与timeWindow()方法一起使用?当涉及迟到时,他们可以干涉吗?在该区域我有什么需要牢记的吗?
【问题讨论】:
标签: apache-flink flink-streaming