Flink中watermark为什么选择最小一条(源码分析)
昨天在社区群看到有人问,为什么水印取最小的一条?这里分享一下自己的理解
首先水印一般是设置为:(事件时间 - 指定的值) 这里的作用是解决迟到数据的问题,从源码来看一下它如何解决的
先来看下windowOperator.java接收到数据以后做了什么
在processElement方法中


因为这里是事件时间窗口所以会默认注册一个事件时间trigger,这是默认trigger的onElement方法

当返回continue时,也就是说水印还没有达到,这条数据属于的窗口的右边界,也就是说窗口还没有到触发的时机
可以看到这里他把这个数据属于的窗口的右边界注册成为一个触发器(timer)
这个timer有什么用呢,来看一下窗口触发的逻辑
所有的上游数据会从这里接收,在StreamInputProcessor.java的processInput()方法中有这样一段逻辑,当接收到水印

里面又调用了

从名字就可以知道是取了一个最小的水印,具体更新最小水印时间逻辑如下

这里就是我们的问题了,为什么他选取了最小的一个水印?
看看这段代码的后面他又做了什么

这个方法里面有很多的调用,其中还包含了更新context.currentWaterMark的逻辑,这里就不列出来了,可以自己点进去看一下,最后会走到这里

这里会判断定时器时间是否小于最小水印时间(是触发定时器的条件)

在onEventTime()方法中

这里看到当返回fire时,会调用emitWindowContents()这个方法里面就会调用我们真正用户的process()方法了,而那个windowState.get()则是拿到了一个窗口中的所有数据
而,是否触发窗口就看onEventTime()方法是否返回Fire,具体实现如下

判断定时器的时间,变量time(前面我们将数据属于的窗口的右边界作为定时器的时间)是否等于窗口右边界的时间,来决定窗口是否触发
!!!那既然最小水印是触发定时器的条件,定时器到时会触发窗口,那我们为什么会选择最小的水印来作为触发条件呢?
看下面这张图

可以看到一个窗口可能会有接收到许多的上游,每一个上游的流都会带有事件时间,那我们哪知道选用哪个流的水印时间作为窗口触发的条件呢?
有个最简单的办法就是:如果我上游每个流中取最小的水印,那就证明其他的水印时间肯定是大于最小的这个,我最小的一条流都达到了窗口的触发时间,那其他来自上游的流肯定都已经超过这个触发时间了,那我就可以触发这个窗口了
Flink中watermark为什么选择最小一条(源码分析)的更多相关文章
- java中的==、equals()、hashCode()源码分析(转载)
在java编程或者面试中经常会遇到 == .equals()的比较.自己看了看源码,结合实际的编程总结一下. 1. == java中的==是比较两个对象在JVM中的地址.比较好理解.看下面的代码: ...
- Vue3中的响应式对象Reactive源码分析
Vue3中的响应式对象Reactive源码分析 ReactiveEffect.js 中的 trackEffects函数 及 ReactiveEffect类 在Ref随笔中已经介绍,在本文中不做赘述 本 ...
- 【小家Spring】聊聊Spring中的数据绑定 --- DataBinder本尊(源码分析)
每篇一句 唯有热爱和坚持,才能让你在程序人生中屹立不倒,切忌跟风什么语言或就学什么去~ 相关阅读 [小家Spring]聊聊Spring中的数据绑定 --- 属性访问器PropertyAccessor和 ...
- RocketMQ中PullConsumer的消息拉取源码分析
在PullConsumer中,有关消息的拉取RocketMQ提供了很多API,但总的来说分为两种,同步消息拉取和异步消息拉取 同步消息拉取以同步方式拉取消息都是通过DefaultMQPullConsu ...
- JDK1.8中LinkedList的实现原理及源码分析
详见:https://blog.csdn.net/cb_lcl/article/details/81222394 一.概述 LinkedList底层是基于双向链表(双向链表的特点, ...
- JDK中的BitMap实现之BitSet源码分析
前提 本文主要内容是分析JDK中的BitMap实现之java.util.BitSet的源码实现,基于JDK11编写,其他版本的JDK不一定合适. 文中的图比特低位实际应该是在右边,但是为了提高阅读体验 ...
- Java并发包中Semaphore的工作原理、源码分析及使用示例
1. 信号量Semaphore的介绍 我们以一个停车场运作为例来说明信号量的作用.假设停车场只有三个车位,一开始三个车位都是空的.这时如果同时来了三辆车,看门人允许其中它们进入进入,然后放下车拦.以后 ...
- 详解SpringMVC中Controller的方法中参数的工作原理[附带源码分析]
目录 前言 现象 源码分析 HandlerMethodArgumentResolver与HandlerMethodReturnValueHandler接口介绍 HandlerMethodArgumen ...
- 【MVC - 参数原理】详解SpringMVC中Controller的方法中参数的工作原理[附带源码分析]
前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:http://www.cnblogs.com/fangjian0423/p/spring ...
随机推荐
- 个人永久性免费-Excel催化剂功能第16波-N多使用场景的多维表转一维表
Excel表的多维表数据结构转换为一维表的数据结构,以供更进一步对数据进行加工整理,生成另外格式的汇总表,这是Excel数据处理的一大刚需,几乎每个Excel表哥.表姐都会遇到这样的使用场景.很可惜, ...
- Spring cloud搭建Eureka高可用注册中心
注册中心在微服务中是必不可少的一部分,主要用来实现服务自治的功能,本文则主要记载使用Netflix提供的Eureka作为注册中心,来实现服务自治的功能. 实际上Eureka的集群搭建方法很简单:每一台 ...
- GStreamer基础教程05 - 播放时间控制
简介 在多媒体应用中,我们通常需要查询媒体文件的总时间.当前播放位置,以及跳转到指定的时间点.GStreamer提供了相应的接口来实现此功能,在本文中,我们将通过示例了解如何查询时间信息,以及如何进行 ...
- DEDECMS教程:织梦栏目更新HTML出现“模板文件不存在,无法解析文档”的解决方法(转)
- linux初学者-文件的归档和传输
1.文件归档 因为linux系统都是以文件的形式存在,所以在处理文件时有时候因为文件太多导致传输速度慢等问题,为了提高方便并且提高效率,常把文件归档,文件归档就是把多个文件变成一个归档文件. 文件 ...
- KNN算法实现手写体区分
KNN算法在python里面可以使用pip install指令安装,我在实现之前查看过安装的KNN算法,十分全面,包括了对于手写体数据集的处理.我这里只是实现了基础的识别方法,能力有限,没有数据处理方 ...
- spring的jdbcTemplate的使用
转载:http://1358440610-qq-com.iteye.com/blog/1826816 一.首先配置JdbcTemplate: 要使用Jdbctemplate 对象来完成jdbc 操作. ...
- Javaweb入门 数据库第一天
数据库概述 本菜鸟使用的数据库软件为Mariadb,以下内容都是以Mariadb数据库软件来写的学习总结. 数据库 所谓的数据库就是用于存储.管理数据的仓库,数据库根据底层存储数据结构的不同可以分为很 ...
- Linux升级GCC
升级原因 测试需要使用DOClever,下载了最新的node8.11,运行node 时候报错 [root@app_test bin]# node www module.js:681 return pr ...
- host配置
host添加地址 今天是我第一天入职,坐到工位的第一件事就是配置host,因为连接测试环境需要本地授权,所以要配置.这里简单记录下配置中遇到的问题和操作的步骤 操作环境是win10,之前公司一直使用的 ...