Flink windows窗口之Windows Assigner和Windows Function

    Windows窗口计算就是通过按照固定时间将数据切分成不同的窗口,然后对窗口内的数据进行计算。Flink DataStream API 将窗口抽象成独立的operator,并且在Flink DataStream内已经建了大多数窗口算子。每个算子中包含了Windows Assigner、Window Trigger(窗口触发器)、Evictor(数据剔除器)、Lateness(时延设定)、Output Tag (输出标签)、Windows Function等部分。

1、Windows Assigner

(1)Keyed和Non-Keyed窗口

         在运行窗口计算时会根据上游数据的类型,设置不同的Windows Assigner。如果上游数据集的数据类型是KeyedStream,则调用DataStream API 的window()方法指定windows assigner;如果不是,则调用DataStream API 的windowAll()方法指定windows assigner。

(2)Windows Assigner

         Flink支持两种类型的窗口,一种是基于时间的窗口,窗口基于起始时间戳和终止时间戳来决定窗口的大小。另一种是基于数量的窗口,根据固定的数据定义窗口的大小。

       windows 窗口有四种类型:滚动窗口(Tumbling Windows)、滑动窗口(Sliding Windows)、会话窗口(Ssession Windows)和全局窗口(Global Windows)。

  • 滚动窗口

       滚动窗口是根据固定的时间或大小进行切割,且窗口和窗口之间的元素互不重叠。DataStream API 基于Event Time 和 Process Time 两种时间类型的Tumbling 窗口,对应的Assigner分别为TumblingEventTime和TumblingProcessTime。

  • 滑动窗口

       滑动窗口是在滚动窗口基础之上增加来窗口的滑动时间(Slide Time),且允许窗口数据发生重叠。DataStream API 基于Event Time 和 Process Time 两种时间类型的Tumbling 窗口,对应的Assigner分别为SlidingEventTime和SlidingProcessTime。

  • 会话窗口

        会话窗口是将某段时间内活跃度较高的数据聚合成一个窗口进行计算,窗口的触发条件是Session Gap,在规定的时间内如果没有数据活跃接入,则认为窗口结束,触发窗口计算结果。

        Session Windows 窗口类型比较适合非连续型数据处理或周期性产生数据的场景。

//通过使用EventTimeSessionWindows 定义 EventTime 滚动窗口
window(EventTimeSessionWindows.withGap(Time.milliseconds(10)))

//通过使用ProcessTimeSessionWindows 定义 ProcessTime 滚动窗口
window(ProcessTimeSessionWindows.withGap(Time.milliseconds(10)))
  • 全局窗口

全局窗口就是将所有相同的key的数据分配到单个窗口中进行计算,窗口没有起始和结束时间,窗口需要借助Trigger来触发计算,如果对Global Windows 指定Trigger ,窗口是不会触发计算。

//通过GlobalWindows 定义Global Windows
window(GlobalWindows.create()) 

 

2、Windows Function

     Flink 中提供四种类型的Window Function,分别是ReduceFuntion、AggregateFunction、FoldFunction以及ProcessWindowFunction。

     四种类型的Window Function 可以根据计算原理的不同可以分为两大类,一类是增量聚合函数,对应有ReduceFunction、AggregateFunction、FoldFunction;另一类是全量窗口函数,对应有ProcessWindowFunction。增量聚合函数计算性能比较高,占用存储空间少,主要因为基于中间状态的计算结果,窗口中只维护中间结果的状态值,不需要缓存原始数据。而全量窗口函数使用的代价相对比较高,性能比较弱,主要是因为此类算子需要对所有属于此类窗口的接入数据进行缓存,然后等到窗口触发的时候,才对所有原始数据进行汇总计算。

  • ReduceFunction

         ReduceFunction 定义了对输入的两个相同类型的数据元素按照指定的计算方法进行整合的逻辑,然后输出类型相同的一个结果元素。

//直接使用表达式
reduce{(v1,v2)=>(v1._1,v1._2+v2._2)}

//实现ReduceFunction接口
reduce(new ReduceFunction [(Int,Long)]) {

  override def reduce(t1:(Int,Long),t2:(Int,Long)):(Int,Long) = {
     (t1._1,t1._2+t2._2)
 }
}

 

  • AggregateFunction

       和ReduceFunction 相似,AggregationFunction也是基于中间状态计算结果的增量计算函数,但AggregationFunction 在窗口上更加通用。AggregationFunction接口比ReduceFunction更加灵活,实现复杂度也相对较高。AggregateFunction接口中定义了三个需要重写的方法,add()定义数据的添加逻辑,getResult定义了根据accumulator计算结果的逻辑,merge定义合并accumulator的逻辑。

  • FoldFunction

        FoldFunction 定义了如何将窗口中的输入元素与外部的元素合并的逻辑。

  • ProcessWindowFunction

        更加灵活地支持基于窗口全部数据元素的结果计算

  • Incremental Aggregation 和 ProcessWindowsFunction 整合

       两者整合后在实现增量聚合计算的同时,也可以操作窗口的元数据信息以及状态数据。

  • ProcessWindowFunction 状态操作

       除了能够通过RichFunction 操作keyed state 之外,ProcessWindowFunction 也可以操作基于窗口之上的状态数据,这类状态被称为Pre-window State 。

博主的微信公众号,不定期发布技术文章,喜欢的可以关注一下哈

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flink是一个开源的流处理框架,它主要运行在Linux环境下。虽然Flink官方不提供Windows平台的二进制发行版,但你仍然可以在Windows上安装和运行Flink。下面是一些步骤来帮助你在Windows上安装Flink: 1. 下载和安装Java:Flink是由Java编写的,所以首先需要安装Java环境。你可以从Oracle官方网站下载并安装JDK。 2. 下载Flink二进制发行版:前往Flink官方网站的下载页面(https://flink.apache.org/downloads.html)下载最新的Flink二进制发行版。选择一个适合你的版本和需求的发行版。 3. 解压缩发行版:将下载的二进制发行版解压到你想要安装Flink的目录。 4. 配置Flink环境变量:将Flink的bin目录添加到系统的PATH环境变量中。这样你可以在命令行中直接运行Flink命令。 5. 启动Flink集群:打开命令提示符(CMD),进入到Flink目录的bin目录下,运行以下命令启动Flink集群: ``` start-cluster.bat ``` 6. 访问Flink Web界面:打开浏览器,访问http://localhost:8081,你将看到Flink的Web界面,可以在这里监控和管理Flink集群。 现在你已经成功在Windows上安装了Flink。你可以使用Flink提供的API编写和运行流处理应用程序。请注意,由于Windows不是Flink的主要支持平台,可能会遇到一些与操作系统相关的问题。如果你在安装或运行中遇到困难,可以参考Flink官方文档或在Flink社区寻求帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值