我有一个Flink程序,它接收两个流,即数据/传感器读数流和警报规则流。我正在广播规则流并将其连接到数据流以生成动态警报。ProcessingTime一切正常,但EventTime没有任何工作。 我已经为我的数据流分配了时间戳和水印,并按原样传递规则流(因为规则流只有在看到新的附加规则/更新时才会有记录(。但不生成警报。
-
当两个流(即一个带有时间戳和水印的流和一个仅具有规则(广播(的流(连接并根据规则动态处理时,如何使用"事件时间"生成警报。
-
我是否还需要为我的规则流分配时间戳和水印?
-
由于我的规则流仅在有任何添加/修改时才有记录。是否有任何解决方法或黑客可以避免/克服这种情况?
任何帮助/建议将不胜感激。
-- 我试过了! 我尝试只使用一个流,即数据流,通过使用硬编码的窗口规则生成警报。而且它工作正常。但是当我将其与规则流连接时,它无法生成任何警报/输出。
"处理时间">一切正常,但"事件时间"则不然。
--我所期待的! 我希望我的程序在将连续数据流与非连续规则流连接时能够工作,以使用"EventTime"生成动态警报。
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;
}
}
这具有让另一个流完全负责水印的效果,这是在这种情况下想要的。