聊聊Flink的必知必会(三)-环球即时
时间:2023-06-17 07:58:19来源:博客园

概述

在进行流处理时,很多时候想要对流的有界子集进行聚合分析。例如有如下的需求场景:(1)每分钟的页面浏览(PV)次数。

(2)每用户每周的会话次数。


【资料图】

(3)每分钟每传感器的最高温度。

(4)当电商发布一个秒杀活动时,想要每隔10min了解流量数据。

对于这些需求的处理,程序需要处理元素组,而不是单个元素,因此,通常使用窗口来限定在数据流上的聚合(如count、sum等)的范围,例如"过去5min内的计数"或"最后100个元素的总和",所以在处理流数据时,通常更有意义的是考虑有限窗口上的聚合,而不是整个流。

在阿里的限流框架Sentinel中,关键的资源数据统计算法也是基于窗口的概念来做的。

窗口(window)是处理无限流的核心,使用窗口计算无界流上的聚合。窗口将流分割为有限大小的组,用户可以对这样的组进行计算。窗口可以是由时间驱动的(例如,每30s),也可以是由数据驱动的(例如,每100个元素)。如下所示

Flink流窗口

通俗点来说,窗口(window)可以将无界流分成有限大小的「桶」,我们基于这个「桶」之上,可以构建各种各样的计算。而无界流的拆分方式可以按时间、或者事件的数量,我们可以根据业务场景来定义窗口的大小。

如何对定义创建流窗口?Flink支持不同类型的窗口,分别介绍如下。

(1)滚动窗口:Tumbling Window,是在流中创建不重叠的相邻窗口。它们是固定长度的窗口,没有重叠。可以根据时间对元素进行分组(例如,从10:00到10:05的所有元素进入一个组),或者根据计数(前50个元素进入一个单独的组)对元素进行分组。例如,可以用它来回答这样的问题:“在不重叠的5min间隔内计算流中元素的数量”。

(2)滑动窗口:Sliding Window,类似于滚动窗口,但是窗口可以重叠。滑动窗口是固定长度的窗口,通过用户给定的窗口滑动参数与前面的窗口重叠。例如,如果需要计算最后5min的指标,但希望每分钟显示一个输出时。

(3)会话窗口:Session Window,当对发生的事件进行分组时,将时间接近的分到一组(一个窗口中)。还可以提供会话间隔的配置参数,该参数指示在关闭会话之前需要等待多长时间。

(4)全局窗口:Global Window,Flink将所有元素放到一个窗口中。通常在这种情况下,每个元素都被分配给一个单一的per-key全局窗口(Global Window)。如果不指定任何触发器,就不会触发任何计算。这只有在定义自定义触发器时才有用,该触发器定义了窗口何时结束。

这几种窗口类型表示,可按如下图表示

窗口分配器

窗口分配器用于定义如何将元素分配给窗口。这是通过在调用window()(针对Keyed Stream)或windowAll()(针对non-keyed stream)时指定所选择的WindowAssigner实现的。WindowAssigner负责将每个传入元素分配给一个或多个窗口。

内置窗口分配器

Flink为最常见的场景(滚动时间窗口、滑动时间窗口、全局窗口和会话窗口)提供了预定义的窗口分配器,它们分别如下。

(1)滚动时间窗口:例如,每分钟PV数据(浏览量),代码如下:

TumblingEventTimeWindows.of(Time.minutes(1))

(2)滑动时间窗口:例如,每10s计算一次每分钟的页面浏览量,代码如下:

SlidingEventTimeWindows.of(Time.minutes(1),Time.seconds(10))

(3)会话窗口:例如,每个会话的PV数据,其中会话定义为会话之间至少30min的间隔,代码如下:

EventTimeSessionWindows.withGap(Time.minutes(30))

所有内置的窗口分配器(全局窗口除外)都根据时间向窗口分配元素。基于时间的窗口分配程序(包括会话窗口)有事件时间和处理时间两种形式。示例如下:

自定义窗口分配器

一个Flink窗口程序的总体结构如下Keyed Stream表示如下,在Keyed Stream的情况下,可以使用传入事件的任何属性作为key。在Keyed Stream的窗口计算由多个任务并行执行,因为每个逻辑Keyed Stream都可以独立于其他流进行处理。所有引用相同key的元素将被发送到相同的并行任务。

// Keyed Windowsstream    .keyBy(...)    .window()    .reduce/aggregate/apply()

non-keyed-stream表示如下,在Keyed Stream的情况下,可以使用传入事件的任何属性作为key。在Keyed Stream的窗口计算由多个任务并行执行,因为每个逻辑Keyed Stream都可以独立于其他流进行处理。所有引用相同key的元素将被发送到相同的并行任务。

// Keyed Windowsstream    .windowAll()    .reduce/aggregate/apply()

参考《Flink原理深入与编程实战》

Flink的Window

标签:

生活指南
  • 主打“大动力”+实用的工具皮卡,试驾江西五十铃全新瑞迈

    全新瑞迈搭载的2 5T柴油涡轮增压发动机+6速手动变速箱动力组合,以及作

  • 打造开放高地 江西赣州国际陆港“融湾”再加速

    近日,一列装载着赣州本地家具、服装、日用品等货物的班列从赣州国际陆

  • 国少闪电战开场5分钟王钰栋潇洒内切破门!孙康博送精妙直塞

    直播吧6月16日讯U17男足亚洲杯C组第一轮,中国U17男足vs塔吉克斯坦U17

  • 天天看热讯:青岛新增3家国家级博士后科研工作站 为高技术人才与企业搭起桥梁

    近日,全国博士后管委会办公室公布了2022年度第二批次博士后科研工作站

  • 安克创新拟发行可转债募资不超过11亿元

    App6月16日消息,安克创新公告,拟发行可转债募资不超过11亿元,用于便

  • 解码5月车市3大特点

    作者:大众侃车 张娜排版:橘子洲头图片:来源于网络,侵删千城数智(

  • 绿色动力环保(01330)将于7月26日派末期股息每股0.1316港元

    绿色动力环保(01330)发布公告,将于2023年7月26日派发截至2022年12

  • 当前观点:普京:俄罗斯放弃了对石油的依赖

    普京:俄罗斯放弃了对石油的依赖

  • 【独家焦点】终于赢了!国足结束18个月不胜纪录,此前9场4平5负

    直播吧6月16日讯国足4-0大胜缅甸,结束了上一次赢球是2021年10月的12强

  • 曹耀民(关于曹耀民介绍)-新要闻

    来为大家解答以上的问题。曹耀民,耀民介绍这个很多人还不知道,现在让

  • 6月20日起,郑州地铁3号线压缩行车间隔

    为进一步满足市民乘客出行需求,自6月20日起,郑州中建深铁3号线提升运

  • 郑东新区豫兴路办事处举办“乡村振兴 河南专场”企业募捐活动

    中原网讯(记者刘梦琳通讯员张震马亚楠)为助力乡村振兴飞速发展,推进豫

  • 每日讯息!“这是在济南,一定会有人赶来施救的”!记者对话四位“水库救人”的济南英雄

    01:506月15日,媒体报道了多位热心市民在孟家水库接力救援落水母女的感

  • 北上资金今日净买入三一重工8.79亿元、宁德时代7.85亿元

    北上资金今日净买入三一重工(600031)8 79亿元、宁德时代(300750)7 85亿

  • 东湖高新: 根据证监会行业分类,公司属于“土木工程建筑业”企业_世界热闻

    东湖高新60013306月16日在投资者关系平台上答复了投资者关心的问题投资

  • 五部门:完善农村产权确权颁证、抵押登记、流转交易、评估处置机制,推动融资配套要素市场改革-全球简讯

    证券时报网讯,据央行消息,中国人民银行、金融监管总局、中国证监会、

  • 民生
    • 四川:扫除未成年人消费"盲区" 消费维权知识进校园 速读

    • 环球观热点:18家AI头部企业、高校与科研机构联合发布共建人工智能框架生态倡议

    • 今日播报!国足VS缅甸首发出炉:武磊领衔艾克森蒋光太首发 林良铭王上源登场

    • 今日热门!上饶银行成功发行第一期20亿元绿色金融债券