Flink 水位线

在数据实时分析的时候,关注的是数据的顺序性,特别是用Flink接收数据的时候考虑到流量在突然到来的峰值,flink反压导致了数据到达处理task的时候时间怎么对齐的问题。这里就需要用到flink 水位线了。

        通俗来理解 Flink有两个时间: EventTime 和 ProcessTime

        (1)EventTime 是从原始消息中提取出来的

        (2)ProcessTime 是 Flink 自己提供的。

假设一个场景,我们需要统计一个URL,在5分钟内被访问的次数,数据结构如下:

URLSTRING
ACCESSTIMELONG
SYSTEMTIMELONG

        ACCESSTIME是这条记录在用户访问网站时产生的时间戳,我们可以认为ACCESSTIME对应到Flink,就是EventTime,后续的统计也是以这个时间为基准来做统计时间窗口的基准字段。

       SYSTEMTIME是数据到达FLINK时的时间戳。

         如下,数据记录,由于数据被延迟,实际到达flink的时间均存在了分钟级的延迟,因此systemtime的都是晚于accesstime几分钟的,按照systemtime进行窗口的统计,得到的数据和accesstime得到的数据是完全不一样的:

       ①http://www.ssss.com/aaa,20220305120122,20220305120900

       ②http://www.ssss.com/aaa,20220305120232,20220305120901

       ③http://www.ssss.com/bbb,20220305120648,20220305120902

       ④http://www.ssss.com/aaa,20220305120441,20220305121202

       ⑤http://www.ssss.com/ccc,20220305120710,20220305121204

       ⑥http://www.ssss.com/bbb,20220305120927,20220305121204

       ⑦http://www.ssss.com/bbb,20220305121018,20220305122104

       ⑧http://www.ssss.com/aaa,20220305121355,20220305122104

如上图,分别按照eventtime 和 processtime 进行统计处理

按5分钟粒度统计得到以下数值(eventtime

00-0506-1011-15
aaa301
bbb030
ccc010

按5分钟粒度统计得到以下数值(processtime

00-0506-1011-1516-20
aaa0211
bbb0113
ccc0001

可以很明显的看出来,按照业务逻辑,eventtime统计的数值是我们需要的,而按照processtime时间进行计算得到的数值是存在问题的。因此,这时候就需要用到了flink的 watermark。

env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
//设置eventtime字段
DataStream<Tuple2<String, String>> streamResult= sourceStream.assignTimestampsAndWatermarks(new AscendingTimestampExtractor<Tuple2<String, String>>() {
		@Override
		public long extractAscendingTimestamp(Tuple2<String, String> element) {
			String[] str = element.f1.split("|");
			return Long.parseLong(str[1]);
		}
});
SingleOutputStreamOperator<MongoSinkObject>  
			time5Min = streamResult.keyBy(0).window(EventTimeSessionWindows.withGap(Time.seconds(300))).allowedLateness(Time.seconds(300)).reduce(new FlowStatReduce()).flatMap(new FlowStatImport("STAT_5MIN")).name("5MIN");

这里用到了

(1)EventTimeSessionWindows,SessionWindos触发会依据数据的EventTime来触发,程序会依据数据流入的最新的时间来当作当前时间,以此为依据来触发以满足的时间间隔的数据分区。

(2)allowedLateness 设定窗口允许的延迟,正常情况下窗口触发计算完成之后就会被小会,但是设定了允许延迟之后,窗口会等待allowedLateness的时长后再销毁。在该区间内的迟到数据任然可以进入窗口中,并触发新的计算。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值