此文已由作者岳猛授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验。

问题

window是解决流计算中的什么问题?

怎么划分window?有哪几种window?window与时间属性之间的关系?

window里面的数据何时被计算?

window 何时被清除?

第一个问题

window是解决流计算中的什么问题?

熟悉google dataflow模型的同学应该清楚,流计算被抽象成四个问题,what,where,when,how?

那么window解决的是where,也就是将无界数据划分成有界数据。

第二个问题

在说明如何划分window之前,我们先看下流计算中有哪几种时间概念

event time:记录发生的时间,比如你点击某个网站当时产生的时间

ingest time:log 进入系统的时间,比如从系统从kafka读进记录的时间

process time:处理时间,记录被处理时的系统时间。

那么window是如何划分的呢?

答案是:

每一条记录来了以后会根据时间属性值采用不同的window assinger 方法分配给一个或者多个窗口。

那么有几种window assinger方式呢,目前来看是每种时间属性对应三种(flink没有基于注入时间的窗口)

1)固定窗口分配:一条记录只属于一个窗口

2)滑动窗口分配:一条记录属于多个窗口

3)会话窗口:一条记录一个窗口

例子:

固定窗口:窗口大小是5s,key为A的数据分别在0,4999ms,5000s产生了数据,那么形成的window如下,窗口允许等待时间为5s

滑动窗口:窗口大小为5s,滑动间隔为1s,key为A的数据分别在0,4999ms,5000s产生了数据,那么形成的window为

session窗口: 间隔5s中,key为A的数据分别在0,4999ms,5000s产生了数据,那么形成的window为

第三个问题,window的数据何时被计算,也就是四个问题中的第三个问题when?

解决这个问题用的方式是watermark和trigger,watermark用来标记窗口的完整性,trigger用来设计窗口数据触发条件。一般的trigger实现是当watermark处于某种时间条件下或者窗口数据达到一定条件,窗口的数据开始计算。

举个常见的trigger实现方式:当watermark越过window边界,触发窗口计算,对第一个固定窗口的三条数据。

基础条件是:watermark和数据本身一样作为正常的消息在流中流动。

1)windowoperator接到消息以后,首先存到state(本文使用rocksdb),存放的格式为k,v,key的格式是key + window,value是key和window对应的数据

2)注册一个timer,timer的数据结构为【key,window,window边界 - 1】,将timer放到集合中去。

3)当windowoperator收到watermark以后,取出集合中小于watermark的timer,触发其window。触发的过程中将state里面对应key及window的数据取出来,这里要经过序列化的过程,发送给windowfunction计算。

4)数据发送给windowfunction,实现windowfunction的window数据计算逻辑

对于固定窗口,当watermark大于5000的时候,(A,0),(A,4999)会被计算,当watermark大于9999的时候,(A,5000)会被计算

最后一个问题。如果window一直存在,那么势必会造成不必要的内存和磁盘浪费

那么window什么时候被清除呢?

每个window都会注册一个cleantime,cleantime代表这个window的存活时间,cleantime = window maxtime + 窗口允许的最大延迟

当watermark > cleanTime的时候,该窗口会被清除,对应的状态也会被清除。对于固定窗口的例子,形成的cleantimer为

当5000 < watermark < 9999的时候,窗口timewindow(0,5000)会被计算不会被清除

当9999 < watermark < 14999的时候,窗口timewindow(5000,10000)会被计算但是不会被清除,清除timewindow(0,5000)

只有watermark 》 14999的时候,清除timewindow(5000,10000)

最后有几个问题?

假如5000 < watermark < 9999,又有timewindow(0, 5000)的延迟数据过来,那么该怎么处理呢?

免费体验云安全(易盾)内容安全、验证码等服务

更多网易技术、产品、运营经验分享请点击

相关文章:
【推荐】 FUI- 我离钢铁侠还差几步?
【推荐】 组建验证码的具体工作流程
【推荐】 一些 ssh 小技巧

Flink window机制的更多相关文章

  1. 一文搞懂Flink Window机制

    Windows是处理无线数据流的核心,它将流分割成有限大小的桶(buckets),并在其上执行各种计算. 窗口化的Flink程序的结构通常如下,有分组流(keyed streams)和无分组流(non ...

  2. Flink 源码解析 —— 深度解析 Flink 序列化机制

    Flink 序列化机制 https://t.zsxq.com/JaQfeMf 博客 1.Flink 从0到1学习 -- Apache Flink 介绍 2.Flink 从0到1学习 -- Mac 上搭 ...

  3. Android全面解析之Window机制

    前言 你好! 我是一只修仙的猿,欢迎阅读我的文章. Window,读者可能更多的认识是windows系统的窗口.在windows系统上,我们可以多个窗口同时运行,每个窗口代表着一个应用程序.但在安卓上 ...

  4. Android之window机制token验证

    前言 很高兴遇见你~ 欢迎阅读我的文章 这篇文章讲解关于window token的问题,同时也是Context机制和Window机制这两篇文章的一个补充.如果你对Android的Window机制和Co ...

  5. Flink Window窗口机制

    总览 Window 是flink处理无限流的核心,Windows将流拆分为有限大小的"桶",我们可以在其上应用计算. Flink 认为 Batch 是 Streaming 的一个特 ...

  6. Apache Flink - Window

    Window: 在Streaming中,数据是无限且连续的,我们不可能等所有数据都到才进行处理,我们可以来一个就处理一下,但是有时我们需要做一些聚合类的处理,例如:在过去的1分钟内有多少用户点击了我们 ...

  7. Flink Window&Time 原理

    Flink 中可以使用一套 API 完成对有界数据集以及无界数据的统一处理,而无界数据集的处理一般会伴随着对某些固定时间间隔的数据聚合处理.比如:每五分钟统计一次系统活跃用户.每十秒更新热搜榜单等等 ...

  8. Flink – window operator

      参考, http://wuchong.me/blog/2016/05/25/flink-internals-window-mechanism/ http://wuchong.me/blog/201 ...

  9. Siddhi CEP Window机制

    https://docs.wso2.com/display/CEP400/SiddhiQL+Guide+3.0#SiddhiQLGuide3.0-Window https://docs.wso2.co ...

随机推荐

  1. iOS之简单瀑布流的实现

    iOS之简单瀑布流的实现   前言 超简单的瀑布流实现,这里说一下笔者的思路,详细代码在这里. 实现思路 collectionView能实现各中吊炸天的布局,其精髓就在于UICollectionVie ...

  2. Python自动生成文章

    为了应付某些情况,需要做17份记录.虽然不很重要,但是17份完全雷同也不很好.大体看了一下,此记录大致分为四段.于是决定每段提供四种选项,每段四选一,拼凑成四段文字,存成一个文件.文件名就叫“XX记录 ...

  3. Linux 系统监控.诊断工具之 IO wait

    1. 常用组合方式有如下几种: 用vmstat.sar.iostat检测是否是CPU瓶颈 用free.vmstat检测是否是内存瓶颈 用iostat.dmesg 检测是否是磁盘I/O瓶颈 用netst ...

  4. Linux 系统编程中环境变量的使用

    前言 在 UNIX Like 系统中,存有各类系统/应用程序的环境变量,可通过修改之改变系统/应用程序的执行效果:除此之外,用户还可以定义自己的环境变量,供自己写的程序使用.本文将说明如何在程序中设置 ...

  5. Tabs in Non-RootViewController Scenarios

    新建空工程如图 添加一个MainStoryboard如图 设置启动项为MainStoryboard 重写AppDelegate的Window方法 public override UIWindow Wi ...

  6. CXF实战之自己定义拦截器(五)

    CXF已经内置了一些拦截器,这些拦截器大部分默认加入到拦截器链中,有些拦截器也能够手动加入,如手动加入CXF提供的日志拦截器.也能够自己定义拦截器.CXF中实现自己定义拦截器非常easy.仅仅要继承A ...

  7. 我们将要建立的EasyDarwin开源社区

    从12年12月我开始建立EasyDarwin开源项目,已经三年多的时间了,从开始最简单的一个开源流媒体服务器项目,如今已经发展成为目前国内最大的一个流媒体开源社区,截至目前已经有十几个项目在Githu ...

  8. Windows程序设计(1)——Win32运行原理(一)

    CPU保护模式与Windows系统 1 Windows多任务 2 虚拟内存 3 处理器的特权级别 内核对象 1 内核对象有什么用 2 对象句柄 3 使用计数 1 CPU保护模式与Windows系统 8 ...

  9. Linux:普通用户不能执行ifconfig命令问题

    有客户现场服务器禁用了root帐号,在普通帐号下,执行ifconfig,提示bash:ifconfig command not found: 导致业务系统无法用普通帐号获取ifcnofig的MAC地址 ...

  10. oracle下 启动subversion命令 及 oracle相关服务启动备忘

    linux shell下  svnserve - d -r + 目录   例如:svnserve -d -r /svn 启动 svn服务. 访问svn://192.168.0.120/kjcg 测试. ...