我在我的应用程序中使用了flink流API,其中流媒体源是kafka。我的kafka制作人将在kafka的不同分区中按升序发布数据,消费者将从这些分区读取数据。但是,由于某些操作,一些kafka分区可能会很慢并产生较晚的结果。有没有办法维护此流中的顺序,尽管数据无序到达。我已经尝试过BoundedOutOfOrdernessTimestampExtractor,但它并没有达到目的。在挖掘这个问题时,我遇到了你的文档(URL:https://cwiki.apache.org/confluence/display/FLINK/Time+and+Order+in+Streams)并试图实现这个但它没有用。我也尝试使用Table API顺序,但似乎你不支持flink 1.5版本中的orderBy。请为我建议任何解决方法。我使用下面的自定义水印生成器并行4。
DataStream<Document> streamSource = env
.addSource(kafkaConsumer).setParallelism(4);
public class BoundedOutOfOrdernessGenerator implements AssignerWithPeriodicWatermarks<Document> {
private final long maxOutOfOrderness = 3500; // 3.5 seconds
private long currentMaxTimestamp;
@Override
public long extractTimestamp(Document event, long previousElementTimestamp) {
Map timeStamp = (Map) event.get("ts");
this.currentMaxTimestamp = (long) timeStamp.get("value");
return currentMaxTimestamp;
}
@Override
public Watermark getCurrentWatermark() {
// return the watermark as current highest timestamp minus the out-of-orderness bound
return new Watermark(currentMaxTimestamp - maxOutOfOrderness);
}
}
谢谢,