一:时间语义:
1.Event Time **************事件时间。 乱序数据。配合Watermark.
2.Ingestion Time 数据进入Flilnk的时间
3.Processing Time;执行操作算子的本地系统时间
二: 由于网络、分布式等原因,导致乱序的产生,所谓乱序,就是指 Flink 接收到的事件的先后顺序不是严格按照事件的 Event Time 顺序排列的。
三:处理乱序数据三重保障
1;引入watermark 比较小 30ms 吼住大部分数据
2.允许处理迟到数据 .allowedLateness(Time.minutes(1))
3.利用侧输出流 .sideOutputLateDate(new OutputTag)
三:解决迟到数据:Watermark 与window连用。
watermark是一条特殊的数据记录。只包含当前事件时间。单调递增。
Watermark=当前事件的最大值-t(延迟)=数据的最大乱序程度。
Watermark的传递:
分布式处理:广播分发。上游向下游传递按照广播。下游接受上游按照分区watermark 取最慢始终。
给数据延迟处理。
window的关窗都是由watermark触发的。改变了原来的时间戳关窗操作 。延迟了关窗时间。
Watermark 是一种衡量 Event Time 进展的机制。
Watermark 是一种衡量 Event Time 进展的机制。
数据流中的 Watermark 用于表示 timestamp 小于 Watermark 的数据,都已经到达了,因此,window 的执行也是由 Watermark 触发的。
Watermark取到是当前事件的时间戳-固定延迟=Watermark
当前时间是5 延迟为2 Watermark就是5-2=3 窗口不变 只是将关窗时间向后推移。
Watermark 应该给看数据的乱序程度。看数据的延迟。
四:设置事件时间予以。配合wataMark
val env: StreamExecutionEnvironment = StreamExecutionEnvironment.getExecutionEnvironment
//设置时间语义 默认TimeCharacteristic.ProcessingTime
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime)
//提取时间戳
val ds = dataStram.map(data => {
val arr: Array[String] = data.split(",")
SensorReading(arr(0), arr(1).toLong, arr(2).toDouble)
})
// .assignAscendingTimestamps(_.timestamp1000) //默认升序提取时间戳 没有乱序数据的情况下。不用定义watermark
//周期性生成watermark.这里定义的watermark为当前的最大时间戳-5.
.assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractorSensorReading {
override def extractTimestamp(element: SensorReading): Long = {element.timestamp1000}
})
//周期性生成watermark 数据比较密集 隔一段时间自动生成watermark long potentialWM = currentMaxTimestamp - maxOutOfOrderness; 默认周期时间为200ms env.getConfig.setAutoWatermarkInterval(500) 设置为500ms
//间断性生成watermark 按照数据 来一条数据生成一个watermark 效率比较低。每一个数据后面都有一个watermark
Flink_时间语义(事件时间)——watamark
最新推荐文章于 2022-04-12 10:26:11 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)