Apache Flink源码解析之stream-windowfunction

简介: Window也即窗口,是Flink流处理的特性之一。前一篇文章我们谈到了Winodw的相关概念及其实现。窗口的目的是将无界的流转换为有界的元素集合,但这还不是最终的目的,最终的目的是在这有限的集合上apply(应用)某种函数,这就是我们本篇要谈的主题——WindowFunction(窗口函数)。

Window也即窗口,是Flink流处理的特性之一。前一篇文章我们谈到了Winodw的相关概念及其实现。窗口的目的是将无界的流转换为有界的元素集合,但这还不是最终的目的,最终的目的是在这有限的集合上apply(应用)某种函数,这就是我们本篇要谈的主题——WindowFunction(窗口函数)。

那么窗口函数会在什么时候被应用呢?还记得上篇文章我们谈到了触发器Trigger,在触发器触发后会返回TriggerResult这个枚举类型的其中一个枚举值。当返回的是FIRE或者FIRE_AND_PURGE时,窗口函数就会在窗口上应用。

Flink中将窗口函数分为两种:

  • AllWindowFunction : 针对全局的不基于某个key进行分组的window的窗口函数的实现
  • WindowFunction : 针对基于某个key进行分组的window的窗口函数的实现

它们在类型继承体系中分属两个不同的体系:

flink-stream-window-function_all-class-diagram

但可以看到,针对这两个体系几乎都提供了相同功能的窗口函数的实现。

AllWindowFunction

所有不基于某个key进行分组的window的窗口函数的实现的基类。该接口是个泛型接口,需要指定三个泛型参数:

  • IN :input数据的类型
  • OUT :output对象的类型
  • W : 继承自Window,表示需要在其上应用该操作的Window的类型

该接口只有一个接口方法:

    void apply(W window, Iterable<IN> values, Collector<OUT> out) throws Exception;

该方法用于在window上的元素集合values进行计算,然后out出0个或多个值。

RichAllWindowFunction

抽象类,继承AbstractRichFunction以提供rich 的AllWindowFunction(AbstractRichFunction提供了open/close方法对以及获得运行时上下文对象的手段)。我们在之前解析SourceFunctionSinkFunction时多次看到这种实现模式。这里该类不提供任何实现。

ReduceIterableAllWindowFunction

ReduceIterableAllWindowFunction用于对其窗口内的所有元素迭代应用reduce操作并合并为一个元素,然后再发射出去。它接收ReduceFunction的实例,以提供reduce函数。

该类apply方法实现如下:

    public void apply(W window, Iterable<T> input, Collector<T> out) throws Exception {

        T curr = null;
        for (T val: input) {
            if (curr == null) {
                curr = val;
            } else {
                curr = reduceFunction.reduce(curr, val);
            }
        }
        out.collect(curr);
    }

reduceFunction#reduce方法,用于将第一个参数和第二个参数进行合并为一个元素。

ReduceApplyAllWindowFunction

ReduceApplyAllWindowFunction用于对窗口内的所有元素进行reduce操作后再进行调用apply。其构造器接收两个参数:

  • reduceFunction : 提供reduce操作的ReduceFunction
  • windowFunction : 提供apply操作的AllWindowFunction,该参数用于对window中元素进行reduce之后产生的单个元素再进行最终的apply操作。

该类的apply实现如下:

public void apply(W window, Iterable<T> input, Collector<R> out) throws Exception {

        T curr = null;
        for (T val: input) {
            if (curr == null) {
                curr = val;
            } else {
                curr = reduceFunction.reduce(curr, val);
            }
        }
        windowFunction.apply(window, Collections.singletonList(curr), out);
    }

PassThroughAllWindowFunction

PassThroughAllWindowFunction该类仅仅提供passthrough功能,也即直接通过发射器将窗口内的元素迭代发射出去,除此之外不进行任何操作。

FoldApplyAllWindowFunction

FoldApplyAllWindowFunction用于对窗口中的数据先进行fold操作,得到一个最终合并的元素,再进行apply操作。因此它需要如下三个参数:

  • initialValue : 应用foldFunction的初始值
  • foldFunction :执行fold操作
  • windowFunction :对fold之后的最终值应用apply操作

该类继承自WrappingFunctionWrappingFunction类似于一个包装器,包装传进来的某个Function,给一些模式化方法(open/close)提供了一些便捷处理。

这里有一点需要区分一下,因为ReduceFunctionFoldFuction都具有将一组元素合并为单个元素的功能,所以他们看起来非常相似。不过他们还是有区别的,其中的一个区别就是,FoldFunction在进行fold操作的时候,还会进行潜在的类型转换。看下面的示例:

ReduceFunction<Integer> {

  public Integer reduce(Integer a, Integer b) { return a + b; }
}

[1, 2, 3, 4, 5] -> reduce()  means: ((((1 + 2) + 3) + 4) + 5) = 15
FoldFunction<String, Integer> {

  public String fold(String current, Integer i) { return current +
String.valueOf(i); }
}

[1, 2, 3, 4, 5] -> fold("start-")  means: ((((("start-" + 1) + 2) + 3) + 4)
+ 5) = "start-12345" (as a String)

WindowFunction

这是Flink的另一个基于key进行分组的WindowFunction。因此跟AllWindowFunction主要的不同的是,其泛型参数多了一个KEY,表示进行分组的key的类型。

同时其接口方法中也相应多了一个参数:

    void apply(KEY key, W window, Iterable<IN> input, Collector<OUT> out) throws Exception;

具体的实现跟AllWindowFunction的实现大同小异,不再多谈。

小结

本篇主要剖析了Flink提供的两种不同的窗口函数AllWindowFunction以及WindowFunction。并对Flink针对AllWindowFunction的实现进行了解读。



原文发布时间为:2016-05-12


本文作者:vinoYang


本文来自云栖社区合作伙伴CSDN博客,了解相关信息可以关注CSDN博客。

相关实践学习
基于Hologres+Flink搭建GitHub实时数据大屏
通过使用Flink、Hologres构建实时数仓,并通过Hologres对接BI分析工具(以DataV为例),实现海量数据实时分析.
实时计算 Flink 实战课程
如何使用实时计算 Flink 搞定数据处理难题?实时计算 Flink 极客训练营产品、技术专家齐上阵,从开源 Flink功能介绍到实时计算 Flink 优势详解,现场实操,5天即可上手! 欢迎开通实时计算 Flink 版: https://cn.aliyun.com/product/bigdata/sc Flink Forward Asia 介绍: Flink Forward 是由 Apache 官方授权,Apache Flink Community China 支持的会议,通过参会不仅可以了解到 Flink 社区的最新动态和发展计划,还可以了解到国内外一线大厂围绕 Flink 生态的生产实践经验,是 Flink 开发者和使用者不可错过的盛会。 去年经过品牌升级后的 Flink Forward Asia 吸引了超过2000人线下参与,一举成为国内最大的 Apache 顶级项目会议。结合2020年的特殊情况,Flink Forward Asia 2020 将在12月26日以线上峰会的形式与大家见面。
目录
相关文章
|
5月前
|
人工智能 数据处理 API
阿里云、Ververica、Confluent 与 LinkedIn 携手推进流式创新,共筑基于 Apache Flink Agents 的智能体 AI 未来
Apache Flink Agents 是由阿里云、Ververica、Confluent 与 LinkedIn 联合推出的开源子项目,旨在基于 Flink 构建可扩展、事件驱动的生产级 AI 智能体框架,实现数据与智能的实时融合。
873 6
阿里云、Ververica、Confluent 与 LinkedIn 携手推进流式创新,共筑基于 Apache Flink Agents 的智能体 AI 未来
|
存储 Cloud Native 数据处理
从嵌入式状态管理到云原生架构:Apache Flink 的演进与下一代增量计算范式
本文整理自阿里云资深技术专家、Apache Flink PMC 成员梅源在 Flink Forward Asia 新加坡 2025上的分享,深入解析 Flink 状态管理系统的发展历程,从核心设计到 Flink 2.0 存算分离架构,并展望未来基于流批一体的通用增量计算方向。
464 0
从嵌入式状态管理到云原生架构:Apache Flink 的演进与下一代增量计算范式
|
7月前
|
SQL 人工智能 数据挖掘
Apache Flink:从实时数据分析到实时AI
Apache Flink 是实时数据处理领域的核心技术,历经十年发展,已从学术项目成长为实时计算的事实标准。它在现代数据架构中发挥着关键作用,支持实时数据分析、湖仓集成及实时 AI 应用。随着 Flink 2.0 的发布,其在流式湖仓、AI 驱动决策等方面展现出强大潜力,正推动企业迈向智能化、实时化的新阶段。
840 9
Apache Flink:从实时数据分析到实时AI
|
7月前
|
SQL 人工智能 API
Apache Flink 2.1.0: 面向实时 Data + AI 全面升级,开启智能流处理新纪元
Apache Flink 2.1.0 正式发布,标志着实时数据处理引擎向统一 Data + AI 平台迈进。新版本强化了实时 AI 能力,支持通过 Flink SQL 和 Table API 创建及调用 AI 模型,新增 Model DDL、ML_PREDICT 表值函数等功能,实现端到端的实时 AI 工作流。同时增强了 Flink SQL 的流处理能力,引入 Process Table Functions(PTFs)、Variant 数据类型,优化流式 Join 及状态管理,显著提升作业稳定性与资源利用率。
741 0
|
6月前
|
人工智能 运维 Java
Flink Agents:基于Apache Flink的事件驱动AI智能体框架
本文基于Apache Flink PMC成员宋辛童在Community Over Code Asia 2025的演讲,深入解析Flink Agents项目的技术背景、架构设计与应用场景。该项目聚焦事件驱动型AI智能体,结合Flink的实时处理能力,推动AI在工业场景中的工程化落地,涵盖智能运维、直播分析等典型应用,展现其在AI发展第四层次——智能体AI中的重要意义。
2046 27
Flink Agents:基于Apache Flink的事件驱动AI智能体框架
|
7月前
|
存储 人工智能 数据处理
对话王峰:Apache Flink 在 AI 时代的“剑锋”所向
Flink 2.0 架构升级实现存算分离,迈向彻底云原生化,支持更大规模状态管理、提升资源效率、增强容灾能力。通过流批一体与 AI 场景融合,推动实时计算向智能化演进。生态项目如 Paimon、Fluss 和 Flink CDC 构建湖流一体架构,实现分钟级时效性与低成本平衡。未来,Flink 将深化 AI Agents 框架,引领事件驱动的智能数据处理新方向。
727 6
|
7月前
|
消息中间件 存储 Kafka
Apache Flink错误处理实战手册:2年生产环境调试经验总结
本文由 Ververica 客户成功经理 Naci Simsek 撰写,基于其在多个行业 Flink 项目中的实战经验,总结了 Apache Flink 生产环境中常见的三大典型问题及其解决方案。内容涵盖 Kafka 连接器迁移导致的状态管理问题、任务槽负载不均问题以及 Kryo 序列化引发的性能陷阱,旨在帮助企业开发者避免常见误区,提升实时流处理系统的稳定性与性能。
611 0
Apache Flink错误处理实战手册:2年生产环境调试经验总结
|
11月前
|
存储 SQL 缓存
Apache Doris & SelectDB 技术能力全面解析
本文将对 Doris & SelectDB 适合的分析场景和技术能力进行概述解析
1642 1
Apache Doris & SelectDB 技术能力全面解析
|
12月前
|
SQL 存储 人工智能
Apache Flink 2.0.0: 实时数据处理的新纪元
Apache Flink 2.0.0 正式发布!这是自 Flink 1.0 发布九年以来的首次重大更新,凝聚了社区两年的努力。此版本引入分离式状态管理、物化表、流批统一等创新功能,优化云原生环境下的资源利用与性能表现,并强化了对人工智能工作流的支持。同时,Flink 2.0 对 API 和配置进行了全面清理,移除了过时组件,为未来的发展奠定了坚实基础。感谢 165 位贡献者的辛勤付出,共同推动实时计算进入新纪元!
1333 1
Apache Flink 2.0.0: 实时数据处理的新纪元

推荐镜像

更多