Apache flink Flink流媒体-保存/打印丢弃的消息

Apache flink Flink流媒体-保存/打印丢弃的消息,apache-flink,Apache Flink,我对flink和streaming也是新手。我使用大小为5秒的滑动窗口和1秒的幻灯片来计算邮件数(检查下面的代码),但我需要帮助保存(或打印)延迟到达的丢弃邮件,我尝试使用sideOutputLateData,但它对我不起作用 val sensorData = stream .assignTimestampsAndWatermarks(new SensorTimeAssigner) .map(x => (x.event_id, x.user_id, 1)) .key

我对flink和streaming也是新手。我使用大小为5秒的滑动窗口和1秒的幻灯片来计算邮件数(检查下面的代码),但我需要帮助保存(或打印)延迟到达的丢弃邮件,我尝试使用sideOutputLateData,但它对我不起作用

val sensorData = stream
    .assignTimestampsAndWatermarks(new SensorTimeAssigner)
    .map(x => (x.event_id, x.user_id, 1))
    .keyBy(x => (x._1, x._2))
    .timeWindow(Time.seconds(5), Time.seconds(1))
    .sum("_3")  
使用sideOutputLateData:

val lateOutputTag = OutputTag[(Int, Int, Int)]("late")
val sensorData = stream
    .assignTimestampsAndWatermarks(new SensorTimeAssigner)
    .map(x => (x.event_id, x.user_id, 1))
    .keyBy(x => (x._1, x._2))
    .timeWindow(Time.seconds(5), Time.seconds(1))
    .sideOutputLateData(lateOutputTag)
    .sum("_3")

sensorData
    .getSideOutput(lateOutputTag)
    .print()

一个可能的答案是,实际上没有任何延迟事件。如果没有将时间特性设置为事件时间,则会出现这种情况。仅使用
和水印是不够的,还需要使用

.window(SlidingEventTimeWindows.of(Time.seconds(5), Time.seconds(1)))
强制Flink使用事件时间窗口,或通过

env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
否则,
timeWindow
实际上是在构建一个
SlidingProcessingTimeWindow
,在这种情况下,任何事情都不会迟到


另一种可能是,您的水印行为与您预期的不符,并且允许所有事件都按时进行。

您的代码看起来应该正常工作。你怎么知道有延迟事件?@DavidAnderson,是的,它确实有效,但对于延迟消息,我想将其放入s3,但到目前为止,我无法做到。对于下沉到s3,我建议你查看StreamingFileSink。如果您使用检查点,请确保启用它——这是必需的,但没有很好的文档记录。此外,请更新您的问题以反映实际情况。@DavidAnderson谢谢您的回复,我最初的问题是如何打印由于迟到而丢弃的邮件,getSideOutput没有输出任何数据我已经通过env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)强制Flink使用事件时间窗口,我确实通过使用ProcessWindowFunction解决了这个问题(看起来我必须使用Flink 1.6的Process function才能使sideOutputLateData正常工作)