Apache flink 如何将自定义水印生成器添加到水印策略

Apache flink 如何将自定义水印生成器添加到水印策略,apache-flink,Apache Flink,我正在使用ApacheFlink 1.11,希望使用一些定制的水印生成器 使用水印策略,您可以轻松添加内置水印生成器: WatermarkStrategy.forMonotonousTimestamps(); WatermarkStrategy.forBoundedOutOfOrderness(Duration.ofSeconds(10)); 在文档中,您可以看到如何实现自定义水印生成器,例如定期水印生成器: public class BoundedOutOfOrdernessGenerat

我正在使用ApacheFlink 1.11,希望使用一些定制的水印生成器

使用水印策略,您可以轻松添加内置水印生成器:

WatermarkStrategy.forMonotonousTimestamps();

WatermarkStrategy.forBoundedOutOfOrderness(Duration.ofSeconds(10));
在文档中,您可以看到如何实现自定义水印生成器,例如定期水印生成器:

public class BoundedOutOfOrdernessGenerator implements WatermarkGenerator<MyEvent> {

    private final long maxOutOfOrderness = 3500; // 3.5 seconds

    private long currentMaxTimestamp;

    @Override
    public void onEvent(MyEvent event, long eventTimestamp, WatermarkOutput output) {
        currentMaxTimestamp = Math.max(currentMaxTimestamp, eventTimestamp);
    }

    @Override
    public void onPeriodicEmit(WatermarkOutput output) {
        // emit the watermark as current highest timestamp minus the out-of-orderness bound
        output.emitWatermark(new Watermark(currentMaxTimestamp - maxOutOfOrderness - 1));
    }

}
公共类BoundedAutofordernessGenerator实现水印生成器{
专用最终长maxOutOfOrderness=3500;//3.5秒
私有长currentMaxTimestamp;
@凌驾
public void onEvent(MyEvent事件、长事件时间戳、水印输出){
currentMaxTimestamp=Math.max(currentMaxTimestamp,eventTimestamp);
}
@凌驾
public void onPeriodicEmit(水印输出){
//以当前最高时间戳减去无序边界的形式发出水印
emitWatermark(新水印(currentMaxTimestamp-maxOutOfOrderness-1));
}
}

如何将此自定义BoundedAutofordernessGenerator添加到水印策略?

您需要定义水印策略。因此,假设您有一个类
MyWatermarkGenerator
,它实现了
WatermarkGenerator
,那么您可以执行如下操作:

watermarkstrategyws=(ctx->newmywatermarkgenerator());
...
数据流ds=xxx;
ds.水印(ws);
请注意,除非您的源代码正在为您设置时间戳(例如Kafka记录时间戳),否则您将希望向水印策略添加时间戳提取器,如

watermarkstrategyws=(ctx->newmywatermarkgenerator());
ws=ws.withTimestampAssigner((r,ts)->r.getTimestamp());

好的,谢谢。在lambda函数中使用的ctx(我认为是上下文)是在哪里定义的?在Flink Java文档中,水印生成器返回一个水印策略的文档在哪里?请参阅。注意,有一个不同的水印策略,它是表API的一部分。lambda表达式用于
createWatermarkGenerator()
调用。是的,这很令人困惑,我最终在Flink源代码中徘徊。