timeWindow不考虑事件时间

时间:2019-02-17 23:10:14

标签: apache-flink flink-streaming

我正在尝试使用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字段作为事件时间,该操作将不依赖于计算机上的实时。我在这里想念东西吗?

1 个答案:

答案 0 :(得分:0)

首先,您必须了解水印以及如何生成水印。

  

什么是水印?

通常,水印是一个声明,即到流中的该点,所有到特定时间戳的事件都应该到达。一旦水印到达操作员,操作员就可以将其内部事件时钟提前到水印的值。有关更多详细信息,请查看official documents

  

如何生成水印?

因为调用了assignAscendingTimestamps函数,这意味着您的水印为(最新接收到的元素的时间戳-1)。因此,您得到的水印正在上升,无法撤消乱序的元素。

  

如何解决这个问题?

定义您自己的水印时间戳记创建者。您可以查看“ assignAscendingTimestamps”的详细实现,并尝试自己编写。