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