process方法中ctx拿到的watermark为什么是上次的watermark?

SingleOutputStreamOperator<DataBean> watered = maped.assignTimestampsAndWatermarks(WatermarkStrategy.<DataBean>forBoundedOutOfOrderness(Duration.ZERO).withTimestampAssigner(new SerializableTimestampAssigner<DataBean>() {
    @Override
    public long extractTimestamp(DataBean dataBean, long l) {
        return dataBean.getTs();
    }
}));

assignTimestampsAndWatermarks,生成水印方法,底层的类,会不断的执行一个定时任务就是 调用 onPeriodicEmit()周期的发送watermark

同时我们看到还有一个onEvent(),在每次收到数据后都会调用一次onEvent方法,不断比较上次的watermark和本次watermark的大小,如果比上次的大就替换成为新的watermark

  1. 到这:第一次 assignTimestampsAndWatermarks 的逻辑就是
  2. assignTimestampsAndWatermarks这个方法内部,会每200ms会调用一次onPeriodicEmit()方法,onPeriodicEmit会output.emitWatermark()输出watermark(maxTimestamp),还有个onEvent的方法,onEvent每次收到数据后会根据数据时间和maxTimestamp取最大值,然后不断更新它,就会根据数据的情况一直生成新的watermark。
  3. 但是当到了数据处理环节后,就不再是这样了
  4. 到了数据处理环节后,每个数据 和 watermark都被包装成了一个StreamElement,每次处理的时候会根据数据类型进行判断,是watermark则更新当前时间,是数据则是正常流程,因此在下游这两个方法不是异步方法,而是同步阻塞的。
  5. 因此新的数据只能拿到上次的watermark时间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值