-
WaterMark是什么?
在了解Flink的WaterMark之前先要了解Flink的时间语义。在Flink里面有三种时间语义:
①Even Time:事件创建的时间,时间在数据里面。
②Ingestion Time:数据进入Flink的时间。
③Processing Time:处理数据的本地系统时间。
由于网络或者分布式系统的原因,在进入Flink的数据里面有的数据是乱序的,如果乱序了,要有一种机制来防止乱序数据影响到数据的最后处理结果,那么WaterMark就是避免乱序数据带来的计算不正确的。
WaterMark是一条特殊的数据,它有一个值,比如设定了延迟是一分钟,先在WaterMark已经涨到了10:00了,说明10:00以前的数据都已经到齐了,9:59分的数据就可以发车了。WaterMark必须是单调递增的,它与数据的时间戳有关。
下面通过图示来介绍WAaterMark的传递:
如图所示,在Flink的任务中有四个并行的子任务,它们初始的WaterMark分别是2,4,3,6,然后第一个子任务的WaterMark为4的数据来着,到达之后就更新自己的WaterMak变成4,那么就说明这个子任务的4之前的数据都到了,其他子任务也是一样。 -
WaterMark的引入和设定
引入watermark只需要在数据流里添加一个方法即可:
Flink的WaterMark详解
最新推荐文章于 2022-03-22 19:27:32 发布
本文介绍了Flink的WaterMark概念,它用于处理事件时间语义下的数据乱序。Flink提供三种时间语义:Event Time、Ingestion Time和Processing Time。WaterMark作为一种特殊数据,确保单调递增,用于标记已接收的最早可能迟到的数据点。通过图示解释了WaterMark在Flink并行任务中的传递,并展示了如何在数据流中引入WaterMark,包括使用AssignerWithPeriodicWatermarks和AssignerWithPunctuatedWatermarks接口来自定义WaterMark生成策略。
摘要由CSDN通过智能技术生成