zoukankan      html  css  js  c++  java
  • 8-Flink中的窗口

    戳更多文章:

    1-Flink入门

    2-本地环境搭建&构建第一个Flink应用

    3-DataSet API

    4-DataSteam API

    5-集群部署

    6-分布式缓存

    7-重启策略

    8-Flink中的窗口

    9-Flink中的Time

    Flink时间戳和水印

    Broadcast广播变量

    FlinkTable&SQL

    Flink实战项目实时热销排行

    Flink写入RedisSink

    17-Flink消费Kafka写入Mysql

    戳原文:

    1-Flink入门

    2-本地环境搭建&构建第一个Flink应用

    3-DataSet API
    4-DataSteam API

    5-集群部署

    6-分布式缓存

    7-重启策略

    8-Flink中的窗口

    9-Flink中的Time

    窗口

    窗口类型

    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 提供了简洁的算子来满足常用的窗口操作,同时提供了通用的窗口机制来允许用户自己定义窗口分配逻辑。

    公众号推荐

    • 全网唯一一个从0开始帮助Java开发者转做大数据领域的公众号,BAT团队集体开发~
    • 海量【java和大数据的面试题+视频资料】整理在公众号,关注后可以下载~
    • 更多大数据技术欢迎和作者一起探讨~
     
    image
  • 相关阅读:
    golang基础--控制语句
    django restful framework 一对多方向更新数据库
    C# 一句很简单而又很经典的代码
    2D图形如何运动模拟出3D效果
    C# 通俗说 委托(和事件)
    C# 定积分求周长&面积原理 代码实现
    Unity 消息发送机制 解析
    Unreal 读书笔记 (二) 类对象的设计
    Unreal 读书笔记 (一) 五个常见基类
    Unreal TEXT FText,FName,FString 浅谈
  • 原文地址:https://www.cnblogs.com/importbigdata/p/10779941.html
Copyright © 2011-2022 走看看