Apache Flink源码解析之stream-windowfunction

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 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轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
Linux入门到精通
本套课程是从入门开始的Linux学习课程,适合初学者阅读。由浅入深案例丰富,通俗易懂。主要涉及基础的系统操作以及工作中常用的各种服务软件的应用、部署和优化。即使是零基础的学员,只要能够坚持把所有章节都学完,也一定会受益匪浅。
目录
相关文章
|
2月前
|
存储 人工智能 大数据
The Past, Present and Future of Apache Flink
本文整理自阿里云开源大数据负责人王峰(莫问)在 Flink Forward Asia 2024 上海站主论坛开场的分享,今年正值 Flink 开源项目诞生的第 10 周年,借此时机,王峰回顾了 Flink 在过去 10 年的发展历程以及 Flink社区当前最新的技术成果,最后展望下一个十年 Flink 路向何方。
413 33
The Past, Present and Future of Apache Flink
|
1天前
|
机器学习/深度学习 自然语言处理 算法
生成式 AI 大语言模型(LLMs)核心算法及源码解析:预训练篇
生成式 AI 大语言模型(LLMs)核心算法及源码解析:预训练篇
|
2月前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是"将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。创建型模式分为5种:单例模式、工厂方法模式抽象工厂式、原型模式、建造者模式。
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
2月前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
2月前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
1月前
|
自然语言处理 数据处理 索引
mindspeed-llm源码解析(一)preprocess_data
mindspeed-llm是昇腾模型套件代码仓,原来叫"modelLink"。这篇文章带大家阅读一下数据处理脚本preprocess_data.py(基于1.0.0分支),数据处理是模型训练的第一步,经常会用到。
60 0
|
2月前
|
安全 搜索推荐 数据挖掘
陪玩系统源码开发流程解析,成品陪玩系统源码的优点
我们自主开发的多客陪玩系统源码,整合了市面上主流陪玩APP功能,支持二次开发。该系统适用于线上游戏陪玩、语音视频聊天、心理咨询等场景,提供用户注册管理、陪玩者资料库、预约匹配、实时通讯、支付结算、安全隐私保护、客户服务及数据分析等功能,打造综合性社交平台。随着互联网技术发展,陪玩系统正成为游戏爱好者的新宠,改变游戏体验并带来新的商业模式。
|
3月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
140 2
|
4月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
101 1
|
4月前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
88 0

推荐镜像

更多