时间(Time)语义

Event Time :事件创建的时间
lngestion Time :数据进入Flink的时间
Processing Time : 执行操作算子的本地系统时间,与机器相关
设置时间语义
首先设置全局时间语义
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
其次指定当前数据里的时间戳是哪个字段
.assignAscendingTimestamps() 括号里要求的字段是毫秒级别时间戳
val dataStream = inputDataStream.map(data => {
val dataArray = data.split(",")
SensorReading(dataArray(0), dataArray(1).toLong, dataArray(2).toDouble)
})
.assignAscendingTimestamps(_.timestamp *1000L)
当flink 以event time 模式处理数据流时,它会根据数据里的时间戳来处理基于时间的算子
由于网络,分布式等原因会导致乱序数据的产生
涉及到 延迟数据 来的晚 如果窗口已经关闭了 就无法处理了
解决方案 watermark
waterMark(水位线)
对于乱序数据流而言,遇到一个时间戳达到窗口关闭时间,不应该立刻触发窗口计算,而是等待一段时间,等迟到的数据来了再关闭窗口。
w

本文详细介绍了Flink中时间语义的三种类型:Event Time、Ingestion Time和Processing Time,并重点讲解了Event Time下处理乱序数据的关键机制——Watermark。Watermark是一种衡量Event Time进展的机制,用于处理延迟数据,确保窗口计算的正确性。文中还讨论了Watermark的特点、生成方式以及多分区情况下的处理,并提到了如何自定义Watermark策略,包括周期性和打点式生成。此外,文章还提及了allowedLateness方法在处理迟到数据中的作用。
最低0.47元/天 解锁文章
1280

被折叠的 条评论
为什么被折叠?



