我正在尝试使用Flink来对从CSV文件加载的(已排序)带时间戳的事件进行基本汇总。
我告诉Flink使用事件时间:
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
然后我在KeyedStream上使用时间窗口
val distances = signals
.assignAscendingTimestamps(_.ts)
.map(s => (s.mmsi, s.ts, getPortDistance(s)))
.keyBy(0)
.window(TumblingEventTimeWindows.of(Time.seconds(1)))
.sum(2).print()
问题在于,将窗口更改为大约10分钟后,实际上会打印出结果!
我的理解是,通过明确告诉Flink使用timestamp字段作为事件时间,该操作将不依赖于计算机上的实时。我在这里想念东西吗?
答案 0 :(得分:0)
首先,您必须了解水印以及如何生成水印。
什么是水印?
通常,水印是一个声明,即到流中的该点,所有到特定时间戳的事件都应该到达。一旦水印到达操作员,操作员就可以将其内部事件时钟提前到水印的值。有关更多详细信息,请查看official documents。
如何生成水印?
因为调用了assignAscendingTimestamps函数,这意味着您的水印为(最新接收到的元素的时间戳-1)。因此,您得到的水印正在上升,无法撤消乱序的元素。
如何解决这个问题?
定义您自己的水印时间戳记创建者。您可以查看“ assignAscendingTimestamps”的详细实现,并尝试自己编写。