在Flink事件时间模式下,我使用定期水印来提前事件时间。每个时隙从传入消息中提取事件时间并发出水印,然后减去网络延迟(例如3000毫秒)。
public Watermark getCurrentWatermark() {
return new Watermark(MAX_TIMESTAMP - DELEY);
}
我有4个活动插槽。问题是只有两个插槽获取传入的数据,但是它们都调用方法getCurrentWatermark()
。因此,在这种情况下,请考虑线程1和2获取传入数据而线程3和4无法获取传入数据的情况。
Thread-1-watermark ---> 1541217659806
Thread-2-watermark ---> 1541217659810
Thread-3-watermark ---> (0 - 3000 = -3000)
Thread-4-watermark ---> (0 - 3000 = -3000)
因此,随着Flink将最低水印设置为一般水印,时间就不会持续了!如果我将getCurrentWatermark()
方法更改为:
public Watermark getCurrentWatermark() {
return new Watermark(System.currentTimeMillis() - DELEY);
}
它可以解决问题,但是我不想使用机器的时间戳!如何解决该问题?
答案 0 :(得分:0)
有一种想法是发送空闲水印,以指示特定分区没有接收任何数据,Windows不应等待它。我个人从来没有尝试过它(甚至还没有更新一些内置的东西,例如Kafka连接器以使用它),但这至少是实现它的地方: