我有一个Flink程序,它接收两个流,即数据/传感器读数流和警报规则流。我正在广播规则流,并将其连接到数据流以生成动态警报。 ProcessingTime一切正常,但EventTime没有任何效果。 我已经为数据流分配了时间戳和水印,并按原样传递了规则流(因为规则流仅在看到新的附加规则/更新时才有记录)。但是不会生成警报。
当两个流(即一个带有时间戳和水印的流和一个仅带有规则(广播的)的流)被连接并根据规则动态处理时,如何使用“ EventTime”来生成警报。
我是否还需要为规则流分配时间戳和水印?
因为我的规则流只有在进行任何添加/修改时才会有记录。是否有任何解决方法或黑客措施可以避免/克服这种情况?
任何帮助/建议都将不胜感激。
-我尝试了什么! 我通过生成带有硬编码窗口规则的警报,仅尝试了一种流(即数据流)。而且工作正常。但是,当我将其与规则流连接时,它无法生成任何警报/输出。
一切都可以在'ProcessingTime'上正常运行,但在'EventTime'上却无法正常运行。
-我期望什么! 当我将连续数据流与不连续规则流连接在一起时,我希望程序能够运行,并使用“ EventTime”生成动态警报。
答案 0 :(得分:3)
Flink培训中的这项练习完全涵盖了这种情况:https://training.ververica.com/exercises/taxiQuery.html。有关详细信息,请参见提示和解决方案,但是此处采取的方法是在流上使用以下时间戳提取器/水印生成器,并遵循以下规则:
// Once the two streams are connected, the Watermark of the KeyedBroadcastProcessFunction operator
// will be the minimum of the Watermarks of the two connected streams. Our query stream has a default
// Watermark at Long.MIN_VALUE, and this will hold back the event time clock of the
// KeyedBroadcastProcessFunction, unless we do something about it.
public static class QueryStreamAssigner implements AssignerWithPeriodicWatermarks<String> {
@Nullable
@Override
public Watermark getCurrentWatermark() {
return Watermark.MAX_WATERMARK;
}
@Override
public long extractTimestamp(String element, long previousElementTimestamp) {
return 0;
}
}
这具有使另一流完全负责水印的效果,这是本例中需要的。