Flink watermark 水位线简介

本文详细解析了Apache Flink中水位线(watermark)的概念及其在不同并发场景下的工作原理,尤其强调了多并发下各进程间水位线的独立性和一致性保证。同时,通过具体代码示例展示了如何在Flink中设置水位线,并实现基于时间窗口的数据处理,包括小时窗口和日窗口的聚合操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

详见:https://blog.youkuaiyun.com/lmalds/article/details/52704170

补充说明:

1、例子的并发度是1,如果是多并发时,情况是不一样的。

env.setParallelism(1);

2、对于多并发情况,各个进程之间的水位线是独立的,也就是每个进程之间有各自的水位线。但是当某个进程触发了自己的窗口,也会触发其他进程相同的窗口,保证了水位线窗口中数据的一致性。

env.setParallelism(n);

3、由于窗口触发有2个条件:(1)水位线到达下一个窗口。(2)触发的窗口中有数据。因为多并发的时候,各个进程之间的水位线是独立的,所以有可能进程 A 某个窗口的数据,需要由进程 B 来触发。

4、如果在设置 watermark 后有多个窗口操作,则窗口之间是共用一个 watermark 的。

// 数据解析过滤
DataStream<OnlineMinuteData> dataStream = transaction.map(s -> OnlineMinuteData.buildOnlineMinuteDataInfo(s))
        .uid("source-map")
        .filter(s -> s != null)
        .uid("source-filter")
        .assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor<OnlineMinuteData>(org.apache.flink.streaming.api.windowing.time.Time.seconds(30)) {
            @Override
            public long extractTimestamp(OnlineMinuteData element) {
                return element.getCountTime();
            }
        })
        .uid("source-water-mark");

DataStream hourLogicalVersionStream = dataStream
        .filter(s -> s.getSourceType() == ServerTableEnum.LOGICAL_SERVER.getServerTableType() && s.getVwType().equals(Constant.ONLINE_DATA_TYPE_VERSION))
        .keyBy("vwType","vwId", "areaId", "serverId")
        .timeWindow(org.apache.flink.streaming.api.windowing.time.Time.hours(1))
        .apply(new LogicalAggWindowResultFunction())
        .uid("hour-logical-version-window");

DataStream dayLogicalVersionStream = dataStream
        .filter(s -> s.getSourceType() == ServerTableEnum.LOGICAL_SERVER.getServerTableType() && s.getVwType().equals(Constant.ONLINE_DATA_TYPE_VERSION))
        .keyBy("vwType","vwId", "areaId", "serverId")
        .timeWindow(org.apache.flink.streaming.api.windowing.time.Time.days(1))
        .apply(new LogicalAggWindowResultFunction())
        .uid("day-logical-version-window");

 

Flink SQL中的水位线Watermark)是一种时间概念,主要用于处理流式数据的事件时间窗口计算。在Apache Flink这样的实时流处理框架中,由于数据的不可预测性和乱序到达,传统的基于点时间(point in time)的处理可能会导致结果不准确。水位线的概念引入了事件的时间依赖性,用于解决这个问题。 简单来说,水位线定义了一个“事件发生应该被处理”的时间范围。对于每个事件,系统会有一个与其关联的水位线,表示该事件发生后允许的最大延迟时间。如果后续的事件晚于这个水位线,那么就认为这些事件已经被处理过了;反之,如果新的事件早于水位线,系统则需要重新考虑之前的状态和计算。 Flink SQL的水位线设置涉及到两个关键参数: 1. **事件时间**(event time):这是相对于实际事件发生的绝对时间。 2. **滑动时间窗口**(sliding window):例如Tumbling Window或Sliding Window,用来定义事件何时进入和离开窗口。 - **事件时间戳**:每条消息都有其生成的时间戳,这是计算水位线的基础。 - **事件时间水印**:根据已接收的消息计算出来的未来可能到达的最新消息时间点。 - **处理时间水印**:基于消息实际到达时间计算的水位线Flink提供了API来调整水位线策略,如EventTimeSessionWindows中的timeBeforeEvent、timeAfterEvent等方法,用于设定水位线的具体行为。通过合理的水位线配置,Flink能够保证即使在数据乱序的情况下,也能正确地处理事件时间窗口内的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值