Flink EventTime和Watermarks原理结合代码分析(转载+解决+精简记录)
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原理结合代码分析(转载+解决+精简记录)相关推荐
- 对dpdk的rte_ring实现原理和代码分析
对dpdk的rte_ring实现原理和代码分析 前言 dpdk的rte_ring是借鉴了linux内核的kfifo实现原理,这里统称为无锁环形缓冲队列. 环形缓冲区通常有一个读指针和一个写指针.读指针 ...
- TrueCrypt 6.2a原理及代码分析
TrueCrypt 6.2a原理及代码分析 3 comments 25th Apr 10 rafa 1 项目物理布局 Project |____ Boot /* MBR部分的代码 */ ...
- 免费的Lucene 原理与代码分析完整版下载
Lucene是一个基于Java的高效的全文检索库. 那么什么是全文检索,为什么需要全文检索? 目前人们生活中出现的数据总的来说分为两类:结构化数据和非结构化数据.很容易理解,结构化数据是有固定格式和结 ...
- Lucene 原理与代码分析完整版
原文地址为: Lucene 原理与代码分析完整版 Lucene 原理与代码分析系列文章已经基本告一段落,可能问题篇还会有新的更新. 完整版pdf可由以下链接下载. Lucene 原理与代码分析完整版 ...
- Lucene原理与代码分析(高手博客备忘)
2019独角兽企业重金招聘Python工程师标准>>> 随笔 - 69 文章 - 77 评论 - 687 随笔分类 - Lucene原理与代码分析 Lucene 4.X 倒排索引 ...
- OpenStack 虚拟机冷/热迁移的实现原理与代码分析
目录 文章目录 目录 前文列表 冷迁移代码分析(基于 Newton) Nova 冷迁移实现原理 热迁移代码分析 Nova 热迁移实现原理 向 libvirtd 发出 Live Migration 指令 ...
- stm32-通用定时器原理及代码分析
目录 定时器:基本,通用 一,基本定时器: 作用: 结构图: 二.通用定时器: 作用: 结构图: 三.代码分析: 1.选择时钟 2.配置时基单元 3.产生中断 4.使用定时器 定时器:基本,通用 一, ...
- 硬盘FAT文件系统原理的详细分析——转载
首先给大家分享一个巨牛巨牛的人工智能教程,是我无意中发现的.教程不仅零基础,通俗易懂,而且非常风趣幽默,还时不时有内涵段子,像看小说一样,哈哈-我正在学习中,觉得太牛了,所以分享给大家!点这里可以跳转 ...
- arm9 c语言函数库,s3c2410(ARM9)启动代码分析(转载)
ADS下C语言的入口方式和ROM镜像文件的生成 这部分介绍下ADS下如何生成可以运行的ROM镜像文件,我们知道当程序下载到flash中运行的时候,对于RW.ZI数据就存在着两个环境,一个load环境, ...
最新文章
- python处理excel表格实例-使用Python操作excel文件的实例代码
- 归并排序执行次数_肯定能懂的常见算法讲解(1)——排序算法
- 来,和腾讯一起共建未来城市
- html5上传使用FileReader,Promise图片预览
- C语言之字符串探究(三):字符串库函数操作——strlen、strcat、strcpy、strcmp
- 装了xcode3.2 后再装xcode4.1 出现的问题 永远build不过
- VBS操作 PDF时,常用快捷键(Adobe Acrobat Reader)
- 安装Mycat 曾经踩的那些坑
- asp.net 4高级程序设计( 第4版)文摘
- 【数据库】范围 通配符 排序(2020.3.18
- 学生作业信息管理系统
- 什么是智能标签?DevExpress WPF控件这份入门指南请查收
- 基于ARM裸机的知识点总结(9)------基于S5PV210的定时器、看门狗和RTC
- 【测试】如何测试微信发红包功能
- java的无参构造方法_Java有参构造方法和无参构造方法
- visio与word
- 阿里云国际版CDN真的这么神奇吗?
- 关于虚拟机显示网络电缆被拔出
- java写一个查询详情接口_旅游景点api 景区详细信息查询服务
- 如何有效避免项目需求蔓延?
热门文章
- 推荐:Java性能优化系列集锦
- IO编程__字节流__输入、输出__图片移动
- 当我们在谈论技术时,技术的本质和价值究竟是什么?
- 【Spring-AOP-1】AOP相关概念
- Python学习笔记- Python threading模块
- ural1297 后缀数组+RMQ
- css预编译工具less使用心得
- word菜单删除,小常识,删除word菜单,WORD菜单栏,删除词霸2003菜单,删除adobe菜单
- java基础格式_Java基础之代码的基本格式
- MySQL中类似ORACLE中decode()判断语句实现