前几天在社区群上,有人问了一个问题

既然上游最小水印会决定窗口触发,那如果我上游其中一条流突然没有了数据,我的窗口还会继续触发吗?

看到这个问题,我蒙了????

对哈,因为我是选择上游所有流中水印最小的一条作为当前水印时间,那万一最小水印的那条流突然里面没有数据了

那我的最小水印不就一直不往前走了,一直是那个没有数据流的水印了吗,因为它的水印最小,而且一直不会更新了

????然后窗口再也不触发????

思考了一下,发现好像也对,当我有一个上游的水印没来的时候,我就等着呗,谁知道他是不是延迟了

但是!!!

万一他真的就是正常的,出现这种hash极端数据倾斜的情况怎么办呢,MQ的一个partation就是没有数据

那难不成我还真不计算了,一直等着?

怀着这个疑问

首先我想到的是,难道是在生成水印的时候,这条流没有数据了,我为了不让流停下来,就算没数据也周期性的发送水印?

但是,无果!!!

那想要流不停下计算只能在source端实现了,于是看了下源码

看到sourceFunction.java接口的这个方法时,便解开了我的疑惑

上面就是说事件时间处理时,可以把流标记为 idle停滞的,就是说这个流不会再发送数据和水印了

且允许下游任务推进

ok 找到了那现在来看一下它是如何实现的,看下具体实现类

这里看到这个streamStatus 的停滞idle状态会被emit广播往下游发送

既然往下发了,看下下游接收到这个status是做了什么

打开StreamInputProcessor.java的processInput()方法  (这里是task端运行job的逻辑以后随缘更新到会细讲)

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

修改了stream和channel的状态为idle 停滞 以后呢

前面就是说如果是来自已经是idle停滞的流的水印,那我就忽略这条水印

然后来看看,来自没有停滞idle的流的水印,是如何更新当前水印的 findAndOutputNewMinWatermarkAcrossAlignedChannels方法

注意到这里

会先判断这个channel是否是idel的!!!!

也就是说当某一个上游的流没有数据停滞了,他是不会参与水印更新逻辑的

真相大白,水印还是会继续往前推进不会停下,计算不会停下

这里就引出了一个思考也是自己在思考的

这里暴露的接口其实是留给我们source源自己实现的,什么时候我们认为流变成了停滞的,我们想他继续强

制推进,继续计算,应该都是要我们自己去决定的,就是说,我是等着数据来才计算呢,还是我继续强制流继续

执行呢,其实是根据自己对source的设计来的,这也是自己的一个思考,自己也没有细研究以后会研究一下主流

source的设计,看能不能解开自己的疑惑

五分钟以后    这!!!FlinkKafkaConsumerBase.java

难道没有offset就停滞了,这么简单吗

java idle 机制_Flink中Idle停滞流机制(源码分析)相关推荐

  1. 什么是cep算子_Flink中的CEP复杂事件处理 (源码分析)

    其实CEP复杂事件处理,简单来说你可以用通过类似正则表达式的方式去表示你的逻辑,表现能力非常的强,用过的人都知道 开篇先偷一张图,整体了解FlinkCEP中的  一种重要的图  NFA FlinkCE ...

  2. netty中的future和promise源码分析(二)

    前面一篇netty中的future和promise源码分析(一)中对future进行了重点分析,接下来讲一讲promise. promise是可写的future,从future的分析中可以发现在其中没 ...

  3. WebRTC[1]-WebRTC中h264解码过程的源码分析

    目录 前言 正文 <WebRTC工作原理精讲>系列-总览_liuzhen007的专栏-CSDN博客_webrtc 原理前言欢迎大家订阅Data-Mining 的<WebRTC工作原理 ...

  4. 【Java】NIO中Selector的select方法源码分析

    该篇博客的有些内容和在之前介绍过了,在这里再次涉及到的就不详细说了,如果有不理解请看[Java]NIO中Channel的注册源码分析, [Java]NIO中Selector的创建源码分析 Select ...

  5. java 向上取整方法 Math.ceil() 用法、源码分析

    刷题用到了,正好好好看看源码. 用法 Math.ceil() 返回值.参数均为double类型, 如果参数为int类型,idea不会报错,但是方法同时不会向上取整. 参数为int类型时,Math.ce ...

  6. Java中的锁大全(底层源码分析)

    引用:https://tech.meituan.com/2018/11/15/java-lock.html 加锁过程:https://www.cnblogs.com/hkdpp/p/11917383. ...

  7. java中 resource_Java中如何获取resource的源码分析

    java 中获取 resource一般通过getResource(),不管你是通过class还是classloader来调用, 首先我们来讲讲getResource(string name)这个nam ...

  8. Java 8中Collectors.groupingBy方法空指针异常源码分析

    现在有这样的一个需求:老板让把所有的员工按年龄进行分组,然后统计各个年龄的人数. 这个需求,如果是在数据库中,可以直接使用一个 group by 语句进行统计即可,那么在 Java 中的话,可以借助于 ...

  9. Java IO完全总结(转载) --- 重点在源码分析

    转载自https://blog.csdn.net/baobeisimple/article/details/1713797 个人认为前面对于输入输出流(超类)的 继承结构,仅仅作为参考知识了解,如果想 ...

  10. Apache Mahout中推荐算法Slope one源码分析

    2019独角兽企业重金招聘Python工程师标准>>> 关于推荐引擎 如今的互联网中,无论是电子商务还是社交网络,对数据挖掘的需求都越来越大了,而推荐引擎正是数据挖掘完美体现:通过分 ...

最新文章

  1. php 定义数组使用逗号,
  2. 怎么找出消耗 CPU 的罪魁祸首?!
  3. matlab函数冒号代表的意思,MATLAB中冒号运算符的含义
  4. 【转】完整java开发中JDBC连接数据库代码和步骤
  5. 定时休眠 linux,linux系统编程手册 定时器和休眠
  6. vCenter6.0配置一:配置分布式交换机
  7. linux安装postgresql数据库
  8. jasoncpp读取jason数据如何判断某一字段是否存在
  9. Hive MetaStore 配置
  10. Max and Min---递归
  11. java做游戏前端_小游戏——金庸奇侠传(JAVA,对面向对象的进一步了解)
  12. ElementUI table 样式修改
  13. Linux BIOS开机自检简介
  14. windows系统镜像修复计算机,Win10系统下修复Windows映像方法
  15. 问题:所有播放器打开均提示网络加载失败,有时候浏览器还打不开网页
  16. 混淆矩阵 confusion_matrix
  17. 微信开发上传视频到服务器,微信小程序中实现上传视频的开发代码
  18. 【OpenCV学习笔记】之图像金字塔(Image Pyramid)
  19. 华为mate40和vivox50pro+哪个好
  20. 安装多可预览控件后,不能正常预览和修改该怎么办?

热门文章

  1. javaEE自驾游旅游景点管理系统ssm
  2. linux7如何改ssid,ssid怎么设置,教您网络ssid怎么设置
  3. 大话西游免费版最新服务器是,2020年4月1日服务器数据互通公告
  4. 设置google搜索页面呈现方式
  5. unity3D professional专业主题——黑色主题设置
  6. 热风销售不合格凉鞋、外套遭处罚,服装商家经营需诚信
  7. LINUX-AWK-删除首行、删除尾行、删除首尾两行
  8. python实现税后工资_Python扣除个人税后的工资计算器
  9. Word 2003 视频教程(转)
  10. 跟着ALEX 学python day2 基础2 模块 数据类型 运算符 列表 元组 字典 字符串的常用操作...