美文网首页
Flink中的5种窗口使用场景

Flink中的5种窗口使用场景

作者: bigdata张凯翔 | 来源:发表于2021-03-22 23:51 被阅读0次

面试官有可能这么问:
1.Flink中对窗口的支持包括哪几种?说说他们的使用场景


  1. flink支持两种划分窗口的方式(time和count) 如果根据时间划分窗口,那么它就是一个time-window 如果根据数据划分窗口,那么它就是一个count-window

  2. flink支持窗口的两个重要属性(size和interval)

  • 如果size=interval,那么就会形成tumbling-window(无重叠数据)
  • 如果size>interval,那么就会形成sliding-window(有重叠数据)
  • 如果size<interval,那么这种窗口将会丢失数据。比如每5秒钟,统计过去3秒的通过路口汽车的数据,将会漏掉2秒钟的数据。
  1. 通过组合可以得出四种基本窗口:
  • time-tumbling-window 无重叠数据的时间窗口,设置方式举例:timeWindow(Time.seconds(5))

  • time-sliding-window 有重叠数据的时间窗口,设置方式举例:timeWindow(Time.seconds(5), Time.seconds(3))

  • count-tumbling-window无重叠数据的数量窗口,设置方式举例:countWindow(5)

  • count-sliding-window 有重叠数据的数量窗口,设置方式举例:countWindow(5,3)

  1. flink支持在stream上的通过key去区分多个窗口

窗口的实现方式
上一张经典图:

image
  • Tumbling Time Window
 假如我们需要统计每一分钟中用户购买的商品的总数,
需要将用户的行为事件按每一分钟进行切分,
这种切分被成为翻滚时间窗口(Tumbling Time Window)。
翻滚窗口能将数据流切分成不重叠的窗口,
每一个事件只能属于一个窗口。

// 用户id和购买数量 stream
val counts: DataStream[(Int, Int)] = ...
val tumblingCnts: DataStream[(Int, Int)] = counts
  // 用userId分组
  .keyBy(0) 
  // 1分钟的翻滚窗口宽度
  .timeWindow(Time.minutes(1))
  // 计算购买数量
  .sum(1) 

  • Sliding Time Window
 我们可以每30秒计算一次最近一分钟用户购买的商品总数。
这种窗口我们称为滑动时间窗口(Sliding Time Window)。
在滑窗中,一个元素可以对应多个窗口。通过使用 DataStream API,我们可以这样实现:

val slidingCnts: DataStream[(Int, Int)] = buyCnts
  .keyBy(0) 
  .timeWindow(Time.minutes(1), Time.seconds(30))
  .sum(1)

  • Tumbling Count Window
    当我们想要每100个用户购买行为事件统计购买总数,那么每当窗口中填满100个元素了,就会对窗口进行计算,这种窗口我们称之为翻滚计数窗口(Tumbling Count Window),上图所示窗口大小为3个。通过使用 DataStream API,我们可以这样实现:
// Stream of (userId, buyCnts)
val buyCnts: DataStream[(Int, Int)] = ...

val tumblingCnts: DataStream[(Int, Int)] = buyCnts
  // key stream by sensorId
  .keyBy(0)
  // tumbling count window of 100 elements size
  .countWindow(100)
  // compute the buyCnt sum 
  .sum(1)

  • Session Window

在这种用户交互事件流中,我们首先想到的是将事件聚合到会话窗口中(一段用户持续活跃的周期),由非活跃的间隙分隔开。如上图所示,就是需要计算每个用户在活跃期间总共购买的商品数量,如果用户30秒没有活动则视为会话断开(假设raw data stream是单个用户的购买行为流)。Session Window 的示例代码如下:

// Stream of (userId, buyCnts)
val buyCnts: DataStream[(Int, Int)] = ...

val sessionCnts: DataStream[(Int, Int)] = vehicleCnts
    .keyBy(0)
    // session window based on a 30 seconds session gap interval 
    .window(ProcessingTimeSessionWindows.withGap(Time.seconds(30)))
    .sum(1)

一般而言,window 是在无限的流上定义了一个有限的元素集合。这个集合可以是基于时间的,元素个数的,时间和个数结合的,会话间隙的,或者是自定义的。Flink 的 DataStream API 提供了简洁的算子来满足常用的窗口操作,同时提供了通用的窗口机制来允许用户自己定义窗口分配逻辑。

相关文章

  • Flink中的5种窗口使用场景

    面试官有可能这么问:1.Flink中对窗口的支持包括哪几种?说说他们的使用场景 flink支持两种划分窗口的方式(...

  • Flink实战(七) - Time & Windows编

    0 相关源码 掌握Flink中三种常用的Time处理方式,掌握Flink中滚动窗口以及滑动窗口的使用,了解Flin...

  • Flink 的窗口checkpoint

    Flink会自动把窗口接收到的元素存入到state中。等到barrier的时候,保存这些state。根据窗口使用的...

  • Flink 的窗口

    Flink 的窗口分类: 1.Flink 的窗口分类如下图: 2. 窗口的详细介绍:

  • 05 Flink窗口

    Flink窗口按行为分有滑动滚动窗口,按划分标准有事件时间窗口。本节将演示各个窗口的使用。 1、 系统、软件以及前...

  • Flink WindowAssigner 源码解析

    [图片上传失败...(image-f7216-1616420673356)] 当你在使用 Flink 窗口的时候有...

  • Flink window窗口机制探究--以tumbling wi

    零、序言 本篇文章探究Flink Window窗口机制,首先介绍窗口机制使用的总纲,涉及的所有组件进行介绍,心中有...

  • flink 时间窗口

    flink强大的窗口功能,是相较于其他流计算引擎比较有优势的地方。flink中窗口是如何设计的?一共有四个要素。1...

  • window.close失效问题

    场景:在实际业务场景中,我们可能会遇到,想要使用js来关闭当前窗口;通常我们是使用 window.close() ...

  • vue打开新窗口

    使用场景 打开新的窗口且需要传递参数 打开新的窗口后调用接口时,需要使用拦截器中配置的 Request Heade...

网友评论

      本文标题:Flink中的5种窗口使用场景

      本文链接:https://www.haomeiwen.com/subject/jmtlzhtx.html