Apache Flink 框架保证Watermark单调递增,算子接收到一个Watermark时候,框架知道不会再有任何小于该Watermark的时间戳的数据元素到来了,所以Watermark可以看做是告诉Apache Flink框架数据流已经处理到什么位置(时间维度)的方式。[3]

这个博客整来自[1]的内容

①代码

②输入数据如下:

nc -lk 3456

(下面的表格在复习温故的时候记得从①②③④⑤的顺序来看,数据->时间戳->水位线->水位线和窗口的比较->决定是否触发)

输入数据 输入数据的对应时间

窗口区间

[window_start_time,

window_end_time)

WaterMark 备注
0001,1538359882000 2018-10-01 10:11:22   2018-10-01 10:11:12.000  
0001,1538359886000 2018-10-01 10:11:26   2018-10-01 10:11:16.000 因为有乱序设置,所以有10s差距
0001,1538359892000 2018-10-01 10:11:32   2018-10-01 10:11:22.000  
0001,1538359893000 2018-10-01 10:11:33   2018-10-01 10:11:23.000  
0001,1538359894000 2018-10-01 10:11:34

2018-10-01 10:11:22.000(输入数据的时间戳)

2018-10-01 10:11:24.000

2018-10-01 10:11:24.000

迟到数据可以理解为,我本来想要34的水位线,但是有10s左右的迟到数据,所以实际水位线是24

触发waterMark计算

10:11:34-10=10:11:24

final Long maxOutOfOrderness = 10000L;

0001,1538359896000 2018-10-01 10:11:36   2018-10-01 10:11:26.000  
0001,1538359897000 2018-10-01 10:11:37

2018-10-01 10:11:24.000

2018-10-01 10:11:27.000

2018-10-01 10:11:27.000 触发waterMark计算
0001,1538359899000 2018-10-01 10:11:39   2018-10-01 10:11:29.000  
0001,1538359891000(乱序数据) 2018-10-01 10:11:31   2018-10-01 10:11:29.000  
0001,1538359903000(乱序数据) 2018-10-01 10:11:43

2018-10-01 10:11:30.000

2018-10-01 10:11:33.000

2018-10-01 10:11:33.000 触发waterMark计算
0001,1538359890000(延迟数据) 2018-10-01 10:11:30

2018-10-01 10:11:30.000

2018-10-01 10:11:33.000

2018-10-01 10:11:33.000 触发waterMark计算
0001,1538359903000(延迟数据) 2018-10-01 10:11:43   2018-10-01 10:11:33.000  
0001,1538359891000(延迟数据) 2018-10-01 10:11:31

2018-10-01 10:11:30.000

2018-10-01 10:11:33.000

2018-10-01 10:11:33.000 触发waterMark计算
0001,1538359892000(延迟数据) 2018-10-01 10:11:32

2018-10-01 10:11:30.000

2018-10-01 10:11:33.000

2018-10-01 10:11:33.000 触发waterMark计算

读表格中的解释:

1.由于乱序时间maxOutOfOrderness的设置,导致waterMark的数值落后于最新且最大的数据大约10s

2.延迟数据/迟到数据 指的是时间戳小于水位线,但是比前一条数据来得晚的被接收的。

3.上面表格的第三列就是[window_start_time,window_end_time)

4.如果window大小是3秒,对应代码是:

TumblingEventTimeWindows.of(Time.seconds(3))

那么1分钟的区间内,会把window划分为如下的形式【左闭右开】

[window_start_time,window_end_time]
[00:00:00,00:00:03)
[00:00:03,00:00:06)
[00:00:06,00:00:09)
[00:00:09,00:00:12)
[00:00:12,00:00:15)
[00:00:15,00:00:18)
[00:00:18,00:00:21)
[00:00:21,00:00:24)
[00:00:24,00:00:27)
[00:00:27,00:00:30)
[00:00:30,00:00:33)
[00:00:33,00:00:36)
[00:00:36,00:00:39)
[00:00:39,00:00:42)
[00:00:42,00:00:45)
[00:00:45,00:00:48)
[00:00:48,00:00:51)
[00:00:51,00:00:54)
[00:00:54,00:00:57)
[00:00:57,00:01:00)

在满足:

一,watermark时间 >= 上面的window_end_time,

二,在[window_start_time,window_end_time)中有数据存在

才会触发WaterMark流计算。

乱序参数maxOutOfOrderness修改的是水位线

延迟参数修改的是延迟数据

--------------------------------------------------------迟到数据处理--------------------------------------------------------------------------------------

①代码

②对于迟到的数据,都通过sideOutputLateData保存到了outputTag中

----------------------------------------------------------一图解千言---------------------------------------------------------------------------------------

对于上面的概念,我画了一张图:

这个图的大意如下:

当WaterMark上升至window_end_time的时候,触发计算。

EventTime表示数据还在水平面(WaterMark)的上方,没有最终落入水面以下。

所以有WaterMark+maxOutOfOrderness=Event TIme

在触发计算的同时,还有一部分数据没有到位,这些数据是延迟数据/迟到数据。

在延迟数据传播的同时,WaterMark也在不断上升,当WaterMark上升至window_end_time+allowedLateness(Time.seconds(2))的时候,即使迟到的数据到达,也会被丢弃。

延迟数据打个比方:

木块(流数据中的水滴)投入水位很浅的脸盆,可以到底部(触发计算)。

木块(流数据中的水滴)投入水位很高的脸盆,难以到底部(数据丢弃)。

Reference:

[1]Flink EventTime和Watermarks案例分析

[2]在线工具

[3]Apache Flink 漫谈系列(03) - Watermark

Flink EventTime和Watermarks原理结合代码分析(转载+解决+精简记录)相关推荐

  1. 对dpdk的rte_ring实现原理和代码分析

    对dpdk的rte_ring实现原理和代码分析 前言 dpdk的rte_ring是借鉴了linux内核的kfifo实现原理,这里统称为无锁环形缓冲队列. 环形缓冲区通常有一个读指针和一个写指针.读指针 ...

  2. TrueCrypt 6.2a原理及代码分析

    TrueCrypt 6.2a原理及代码分析 3 comments 25th Apr 10 rafa 1 项目物理布局 Project     |____ Boot /* MBR部分的代码 */     ...

  3. 免费的Lucene 原理与代码分析完整版下载

    Lucene是一个基于Java的高效的全文检索库. 那么什么是全文检索,为什么需要全文检索? 目前人们生活中出现的数据总的来说分为两类:结构化数据和非结构化数据.很容易理解,结构化数据是有固定格式和结 ...

  4. Lucene 原理与代码分析完整版

    原文地址为: Lucene 原理与代码分析完整版 Lucene 原理与代码分析系列文章已经基本告一段落,可能问题篇还会有新的更新. 完整版pdf可由以下链接下载. Lucene 原理与代码分析完整版 ...

  5. Lucene原理与代码分析(高手博客备忘)

    2019独角兽企业重金招聘Python工程师标准>>> 随笔 - 69  文章 - 77  评论 - 687 随笔分类 - Lucene原理与代码分析 Lucene 4.X 倒排索引 ...

  6. OpenStack 虚拟机冷/热迁移的实现原理与代码分析

    目录 文章目录 目录 前文列表 冷迁移代码分析(基于 Newton) Nova 冷迁移实现原理 热迁移代码分析 Nova 热迁移实现原理 向 libvirtd 发出 Live Migration 指令 ...

  7. stm32-通用定时器原理及代码分析

    目录 定时器:基本,通用 一,基本定时器: 作用: 结构图: 二.通用定时器: 作用: 结构图: 三.代码分析: 1.选择时钟 2.配置时基单元 3.产生中断 4.使用定时器 定时器:基本,通用 一, ...

  8. 硬盘FAT文件系统原理的详细分析——转载

    首先给大家分享一个巨牛巨牛的人工智能教程,是我无意中发现的.教程不仅零基础,通俗易懂,而且非常风趣幽默,还时不时有内涵段子,像看小说一样,哈哈-我正在学习中,觉得太牛了,所以分享给大家!点这里可以跳转 ...

  9. arm9 c语言函数库,s3c2410(ARM9)启动代码分析(转载)

    ADS下C语言的入口方式和ROM镜像文件的生成 这部分介绍下ADS下如何生成可以运行的ROM镜像文件,我们知道当程序下载到flash中运行的时候,对于RW.ZI数据就存在着两个环境,一个load环境, ...

最新文章

  1. python处理excel表格实例-使用Python操作excel文件的实例代码
  2. 归并排序执行次数_肯定能懂的常见算法讲解(1)——排序算法
  3. 来,和腾讯一起共建未来城市
  4. html5上传使用FileReader,Promise图片预览
  5. C语言之字符串探究(三):字符串库函数操作——strlen、strcat、strcpy、strcmp
  6. 装了xcode3.2 后再装xcode4.1 出现的问题 永远build不过
  7. VBS操作 PDF时,常用快捷键(Adobe Acrobat Reader)
  8. 安装Mycat 曾经踩的那些坑
  9. asp.net 4高级程序设计( 第4版)文摘
  10. 【数据库】范围 通配符 排序(2020.3.18
  11. 学生作业信息管理系统
  12. 什么是智能标签?DevExpress WPF控件这份入门指南请查收
  13. 基于ARM裸机的知识点总结(9)------基于S5PV210的定时器、看门狗和RTC
  14. 【测试】如何测试微信发红包功能
  15. java的无参构造方法_Java有参构造方法和无参构造方法
  16. visio与word
  17. 阿里云国际版CDN真的这么神奇吗?
  18. 关于虚拟机显示网络电缆被拔出
  19. java写一个查询详情接口_旅游景点api 景区详细信息查询服务
  20. 如何有效避免项目需求蔓延?

热门文章

  1. 推荐:Java性能优化系列集锦
  2. IO编程__字节流__输入、输出__图片移动
  3. 当我们在谈论技术时,技术的本质和价值究竟是什么?
  4. 【Spring-AOP-1】AOP相关概念
  5. Python学习笔记- Python threading模块
  6. ural1297 后缀数组+RMQ
  7. css预编译工具less使用心得
  8. word菜单删除,小常识,删除word菜单,WORD菜单栏,删除词霸2003菜单,删除adobe菜单
  9. java基础格式_Java基础之代码的基本格式
  10. MySQL中类似ORACLE中decode()判断语句实现