SlidingEventTimeWindows 不产生任何输出

时间:2021-06-16 09:21:11

标签: java apache-flink flink-streaming

我有一个流执行配置为

StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

DataStreamSource<Record> stream = env.addSource(new FlinkKafkaConsumer(
    SystemsCpu.TOPIC,
    ConfluentRegistryAvroDeserializationSchema.forGeneric(SystemsCpu.SCHEMA, registry),
    config)
    .setStartFromLatest());

DataStream<Anomaly> anomalies = stream
    .keyBy(x -> x.get("host").toString())
    .window(SlidingEventTimeWindows.of(Time.minutes(20), Time.seconds(20))) // produces output with TumblingEventTimeWindows
    .process(new AnomalyDetector())
    .name("anomaly-detector");

public class AnomalyDetector extends ProcessWindowFunction<Record, Anomaly, String, TimeWindow> {

  @Override
  public void process(String key, Context context, Iterable<Record> input, Collector<Anomaly> out) {
    var anomaly = new Anomaly();
    anomaly.setValue(1.0);
    out.collect(anomaly);
  }
}

但是由于某种原因,SlidingEventTimeWindows 不会产生任何要由 AnomalyDetector 处理的输出(即根本不会触发进程)。例如,如果我使用 TumblingEventTimeWindows,它会按预期工作。

任何想法可能导致这种情况?我是否错误地使用了 SlidingEventTimeWindows

2 个答案:

答案 0 :(得分:2)

在进行任何类型的事件时间窗口化时,有必要提供 WatermarkStrategy。水印标记流中的一个点,并表示流已通过某个特定时间点完成。事件时间窗口只能由足够大的水印到达触发。

有关详细信息,请参阅 the docs,但这可能是这样的:

DataStream<MyType> timestampedEvents = events
  .assignTimestampsAndWatermarks(
      WatermarkStrategy
        .<MyType>forBoundedOutOfOrderness(Duration.ofSeconds(10))
        .withTimestampAssigner((event, timestamp) -> event.timestamp));

但是,由于您使用的是 Kafka,通常最好让 Flink Kafka 消费者进行水印:

FlinkKafkaConsumer<MyType> kafkaSource = new FlinkKafkaConsumer<>("myTopic", schema, props);

kafkaSource.assignTimestampsAndWatermarks(WatermarkStrategy...);

DataStream<MyType> stream = env.addSource(kafkaSource);

请注意,如果您使用后一种方法,并且如果您的事件在每个 Kafka 分区内按时间顺序排列,您可以利用 Flink Kafka 源提供的每个分区水印,并使用 WatermarkStrategy.forMonotonousTimestamps() 而不是而不是有界有序策略。这有许多优点。

顺便说一下,这与您的问题无关,但您应该注意,通过指定 SlidingEventTimeWindows.of(Time.minutes(20), Time.seconds(20)),每个事件都将被复制到 60 个重叠窗口中的每一个。

答案 1 :(得分:1)

您正在使用 SlidingEventTimeWindows,但您的流执行环境默认配置为处理时间。使用 SlidingProcessingTimeWindows 或像这样为事件时间配置您的环境

env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)

活动时间还需要一个特殊的时间戳分配器,您可以在此处找到更多信息。

https://www.ververica.com/blog/stream-processing-introduction-event-time-apache-flink?hs_amp=true

相关问题