Flink中Idle停滞流机制(源码分析)
前几天在社区群上,有人问了一个问题
既然上游最小水印会决定窗口触发,那如果我上游其中一条流突然没有了数据,我的窗口还会继续触发吗?
看到这个问题,我蒙了????
对哈,因为我是选择上游所有流中水印最小的一条作为当前水印时间,那万一最小水印的那条流突然里面没有数据了
那我的最小水印不就一直不往前走了,一直是那个没有数据流的水印了吗,因为它的水印最小,而且一直不会更新了
????然后窗口再也不触发????
思考了一下,发现好像也对,当我有一个上游的水印没来的时候,我就等着呗,谁知道他是不是延迟了
但是!!!
万一他真的就是正常的,出现这种hash极端数据倾斜的情况怎么办呢,MQ的一个partation就是没有数据
那难不成我还真不计算了,一直等着?
怀着这个疑问
首先我想到的是,难道是在生成水印的时候,这条流没有数据了,我为了不让流停下来,就算没数据也周期性的发送水印?
于是有了这篇文章 Flink中Periodic水印和Punctuated水印实现原理(源码分析)
但是,无果!!!
那想要流不停下计算只能在source端实现了,于是看了下源码

看到sourceFunction.java接口的这个方法时,便解开了我的疑惑
上面就是说事件时间处理时,可以把流标记为 idle停滞的,就是说这个流不会再发送数据和水印了
且允许下游任务推进
ok 找到了那现在来看一下它是如何实现的,看下具体实现类


这里看到这个streamStatus 的停滞idle状态会被emit广播往下游发送
既然往下发了,看下下游接收到这个status是做了什么
打开StreamInputProcessor.java的processInput()方法 (这里是task端运行job的逻辑以后随缘更新到会细讲)

这里接收到了某上游流的状态改变了,这里毫无疑问就是更新stream的状态

修改了stream和channel的状态为idle 停滞 以后呢
来到水印更新的逻辑 (这里不了解的可以看看这里 Flink中watermark为什么选择最小一条(源码分析))

前面就是说如果是来自已经是idle停滞的流的水印,那我就忽略这条水印
然后来看看,来自没有停滞idle的流的水印,是如何更新当前水印的 findAndOutputNewMinWatermarkAcrossAlignedChannels方法

注意到这里
会先判断这个channel是否是idel的!!!!
也就是说当某一个上游的流没有数据停滞了,他是不会参与水印更新逻辑的
真相大白,水印还是会继续往前推进不会停下,计算不会停下
这里就引出了一个思考也是自己在思考的
这里暴露的接口其实是留给我们source源自己实现的,什么时候我们认为流变成了停滞的,我们想他继续强
制推进,继续计算,应该都是要我们自己去决定的,就是说,我是等着数据来才计算呢,还是我继续强制流继续
执行呢,其实是根据自己对source的设计来的,这也是自己的一个思考,自己也没有细研究以后会研究一下主流
source的设计,看能不能解开自己的疑惑
五分钟以后 这!!!FlinkKafkaConsumerBase.java

难道没有offset就停滞了,这么简单吗
Flink中Idle停滞流机制(源码分析)的更多相关文章
- Flink中异步AsyncIO的实现 (源码分析)
先上张图整体了解Flink中的异步io 阿里贡献给flink的,优点就不说了嘛,官网上都有,就是写库不会柱塞性能更好 然后来看一下, Flink 中异步io主要分为两种 一种是有序Ordered 一种 ...
- Flink中的CEP复杂事件处理 (源码分析)
其实CEP复杂事件处理,简单来说你可以用通过类似正则表达式的方式去表示你的逻辑,表现能力非常的强,用过的人都知道 开篇先偷一张图,整体了解Flink中的CEP中的 一种重要的图 NFA非确定有限状 ...
- Flink 中LatencyMarks延迟监控(源码分析)
流式计算中处理延迟是一个非常重要的监控metric flink中通过开启配置 metrics.latency.interval 来开启latency后就可以在metric中看到askManage ...
- Flink的Job启动TaskManager端(源码分析)
前面说到了 Flink的JobManager启动(源码分析) 启动了TaskManager 然后 Flink的Job启动JobManager端(源码分析) 说到JobManager会将转化得到 ...
- Springboot学习04-默认错误页面加载机制源码分析
Springboot学习04-默认错误页面加载机制源码分析 前沿 希望通过本文的学习,对错误页面的加载机制有这更神的理解 正文 1-Springboot错误页面展示 2-Springboot默认错误处 ...
- ApplicationEvent事件机制源码分析
<spring扩展点之三:Spring 的监听事件 ApplicationListener 和 ApplicationEvent 用法,在spring启动后做些事情> <服务网关zu ...
- Android事件分发机制源码分析
Android事件分发机制源码分析 Android事件分发机制源码分析 Part1事件来源以及传递顺序 Activity分发事件源码 PhoneWindow分发事件源码 小结 Part2ViewGro ...
- RocketMQ中Broker的HA策略源码分析
Broker的HA策略分为两部分①同步元数据②同步消息数据 同步元数据 在Slave启动时,会启动一个定时任务用来从master同步元数据 if (role == BrokerRole.SLAVE) ...
- Android线程间异步通信机制源码分析
本文首先从整体架构分析了Android整个线程间消息传递机制,然后从源码角度介绍了各个组件的作用和完成的任务.文中并未对基础概念进行介绍,关于threadLacal和垃圾回收等等机制请自行研究. 基础 ...
随机推荐
- Java之Map接口(双列集合)
Map集合概述 现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等,这种一一对应的关系,就叫做映射.Java提供了专门的集合类用来存放这种对象关系的对 ...
- CSP2019 游记
\(\text{CSP 2019}\) 游记 \[\text{草}\] \[\text{By:Luckyblock}\] \[Day\ -1:\] \(19:00\) 送行饭, 被摁在墙角干了 因为偏 ...
- 这可能是最漂亮的Spring事务管理详解
事务概念回顾 什么是事务? 事务是逻辑上的一组操作,要么都执行,要么都不执行. 事物的特性(ACID): 原子性: 事务是最小的执行单位,不允许分割.事务的原子性确保动作要么全部完成,要么完全不起作用 ...
- 目前下载VS2017你可能会遇到这个坑
可能现在大伙都已经开始使用VS2019进行开发了.VS2019的下载使用也都很简单.由于工作需要,今天要在笔记本上安装VS2017,结果发现,VS2017的下载变得不是那么容易了,官方的下载方式也隐藏 ...
- NIO零拷贝的深入分析
深入分析通过Socket进行数据文件传递中的传统IO的弊端以及NIO的零拷贝实现原理,及用户空间和内核空间的切换方式 传统的IO流程 在这个过程中: 数据从磁盘拷贝进内核空间缓冲区 从内核空间缓冲区拷 ...
- CSS学习笔记-过度模块-编写过渡效果
过渡模块-编写过渡效果: 1.编写过渡套路: 1.1不要管过渡,先编写基本界面 1.2修改我们认为需要修改的属性 1.3再给被修改属性的元素添加过渡即可 2.弹性效果 < ...
- SAP 固定资产添加新类别
需求:添加资产新类别(LEASE) 步骤: 1.添加 Account determination ①SPRO->Financial Accounting(New)->Asset Accou ...
- Kotlin Parameter specified as non-null is null
报错信息如下: java.lang.IllegalArgumentException: Parameter specified as non-null is null: method kotlin.j ...
- GitHub访问速度慢的一种优化方法
GitHub是一个面向开源及私有软件项目的托管平台,因为只支持Git 作为唯一的版本库格式进行托管,故名GitHub. 由于GitHub是一个国外网站,在国内访问速度如何呢? 我们通过浏览器访问下ht ...
- WebAPI的使用
后台API的代码: using System; using System.Collections.Generic; using System.Linq; using System.Web; using ...