Flink水印全球化?

时间:2019-02-19 19:53:12

标签: apache-flink

假设我有两个使用事件时间的不同数据流。

class TSWM implements AssignerWithPunctuatedWatermarks<POJO> {
   long maxTS = Long.MIN_VALUE;
   @Override
  public Watermark checkAndGetNextWatermark(POJO event, long l) {
    maxTS = Math.max(maxTS, event.TS);
    return new Watermark(getMaxTimestamp());
  }

  @Override
  public long extractTimestamp(POJO event, long l) {
    maxTS = Math.max(maxTS, event.TS);
    return event.TS;
  }
}

DataStream<POJO> ds1 = ... .assignTimestampsAndWatermarks(new TSWM())

DataStream<POJO> ds2 = ... .assignTimestampsAndWatermarks(new TSWM())

所以现在我有两个不同的数据流,我的问题是,时间戳和水印是分别独立于每个数据流还是中央时钟?

我正在做一些其他复杂的加窗操作,并重新分配时间戳和水印,并且它不生成加窗数据,因此我感到水印或时间戳是问题所在。

1 个答案:

答案 0 :(得分:0)

从某种意义上说,水印是“全局的”,但有以下警告:

  1. assignTimestampsAndWatermarks的每个并行实例都会进行自己的水印处理
  2. 当操作员连接两个流(例如CoProcessFunction)时,其水印是传入水印中的最小值
  3. 使用Kafka,您可以安排按Kafka分区的水印处理