Flink 中的窗口


在流式计算中,我们所接入的数据集是无限流,或者说是没有边界的数据流。那么有没有办法将无限流转换为有限流呢?这里就需要引入 Window(窗口)的概念,通过 Window 我们可以按照固定时间或长度将无限数据流切分成不同长度的有限数据块,然后在每个窗口内针对数据块进行聚合运算。

Window 分类

Keyed Window 和 Global Window
Time Window 和 Count Window
Window API

Time Window 和 Count Window
Time Window
基于时间定义的窗口。根据不同业务场景又可以分为滚动窗口(Tumbling Window)、滑动窗口(Sliding Window)和会话窗口(Session Window)三种。

滚动窗口(Tumbing Window):

滚动窗口是按照固定时间进行切分,而且所有窗口之间的数据不会重叠,使用时只需要指定一个窗口长度即可。
图片描述

从上面的示例图中可以看到,滚动窗口的窗口大小(window size)是固定的,而且相邻窗口之间是连续的。现在有这样的业务场:某公司要求每 10 秒统计一次最近 10 秒内各个电商平台的订单数量并输出到大屏幕,这时候就需要用到滚动窗口了,我们只需要将窗口大小设置为 10 秒就可以。我们使用 netcat 发送 Socket 数据来模拟订单流量。

在 com.xxx.window 包下创建 TumblingWindow Scala Object,代码如下:

package com.xxx.window

import org.apache.flink.streaming.api.scala._
import org.apache.flink.streaming.api.windowing.time.Time

object TumblingWindow {
   
  def main(args: Array[String]): Unit = {
   
    val env = StreamExecutionEnvironment.getExecutionEnvironment
    val textDstream: DataStream[String] = env.socketTextStream("localhost", 9999)

    import org.apache.flink.streaming.api.scala._

    val dataStream: DataStream[(String, Int)] = textDstream
      .filter(_.nonEmpty)
      .map((_, 1))
      .keyBy(0) // 按照第0个字段分组
      .timeWindow(Time.seconds(10)) // 设定窗口大小
      .sum(1) // 对第1个字段求和

    dataStream.print().setParallelism(1)

    env.execute("Tumbling Window")
  }
}

在上面的代码中,我们监听了 localhost 的 9999 端口,将接收到的

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Colin_lqk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值