Flink window 源码分析1:窗口整体执行流程

这篇具有很好参考价值的文章主要介绍了Flink window 源码分析1:窗口整体执行流程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

注:本文源码为flink 1.18.0版本。
其他相关文章:
Flink window 源码分析1:窗口整体执行流程
Flink window 源码分析2:Window 的主要组件
Flink window 源码分析3:WindowOperator
Flink window 源码分析4:WindowState

1 window 的重要组件

Window 本质上就是借助状态后端缓存着一定时间段内的数据,然后在达到某些条件时触发对这些缓存数据的聚合计算,输出外部系统。
windowedstream 源码,flink,java,大数据,big data
其主要组件有:Window Assigners、Triggers、Evictors。这三个组件的详细讲解请看笔记:Flink window 源码分析2:Window 的主要组件。

  1. Window Assigners
    Window assigner 定义了 stream 中的元素如何被分发到各个窗口。
    Time Window 会创建一个 EventTimeTrigger 用来制定窗口触发时间。Count Window 和 GlobalWindow需要指定窗口触发器。
    可以通过继承 WindowAssigner 抽象类实现自定义。
  2. Triggers
    决定窗口是否触发。
    Trigger 接口中有些主要的方法:onElement、onEventTime、onProcessingTime。
    windowedstream 源码,flink,java,大数据,big data
  3. Evictors(可选择是否指定)
    在 trigger 触发后、调用窗口函数之前或之后从窗口中删除元素。
    指定 evictors 可以避免预聚合(pre-aggregation),因为窗口内所有元素必须在应用计算之前传递给 evictors。
    Flink 不保证窗口内元素的顺序。这意味着虽然 evictors 可以从窗口的开头移除元素,但这些元素不一定是先到的还是后到的。
    windowedstream 源码,flink,java,大数据,big data

2 window 的触发过程

KeyedStream 调用 window 函数会生成 WindowStream。WindowedStream 可以调用 reduce、aggregate、apply、process 等函数。 以下是 window 函数使用示例。

source.keyBy((KeySelector<Tuple2<Long, String>, String>) value -> value.f2)  
.window(TumblingEventTimeWindows.of(Time.seconds(60)))  
.apply(...);

window 函数源码如下。返回了一个 WindowedStream。

@PublicEvolving  
public <W extends Window> WindowedStream<T, KEY, W> window(  
        WindowAssigner<? super T, W> assigner) {  
    return new WindowedStream<>(this, assigner);  
}

观察 reduce、aggregate、apply、process 等处理函数,会看到会进一步调用属性 builder 的对应的 reduce、aggregate、apply、process 方法。以 reduce 源码为例,可以看到倒数第2行 builder.reduce。

@Internal  
public <R> SingleOutputStreamOperator<R> reduce(  
        ReduceFunction<T> reduceFunction,  
        ProcessWindowFunction<T, R, K, W> function,  
        TypeInformation<R> resultType) {  
    // clean the closures  
    function = input.getExecutionEnvironment().clean(function);  
    reduceFunction = input.getExecutionEnvironment().clean(reduceFunction);  
  
    final String opName = builder.generateOperatorName();  
    final String opDescription = builder.generateOperatorDescription(reduceFunction, function);  
    OneInputStreamOperator<T, R> operator = builder.reduce(reduceFunction, function);  
  
    return input.transform(opName, resultType, operator).setDescription(opDescription);  
}

builder 是 WindowOperatorBuilder,在 WindowedStream 的构造函数中有其初始化。builder 定义为:

private final WindowOperatorBuilder<T, K, W> builder;

进一步观察 builder.reduce(),看到其最终返回是 WindowOperator。在函数返回时会判断evictor是否为空,走不同的构造 WindowOperator 的逻辑,如果 evictor 不为空就构造 EvictingWindowOperator 对象,否则就构造 WindowOperator 对象,其实 EvictingWindowOperator 是 WindowOperator 的一个子类,只是多了一个删除数据的逻辑。WindowOperator 在创建时会传入一个 StateDescriptor 用于创建状态,存储中间结果或元素。
WindowOperator 的具体分析见:WindowOperator 的分析笔记。文章来源地址https://www.toymoban.com/news/detail-793899.html

public <R> WindowOperator<K, T, ?, R, W> reduce(  
        ReduceFunction<T> reduceFunction, WindowFunction<T, R, K, W> function) {  
    Preconditions.checkNotNull(reduceFunction, "ReduceFunction cannot be null");  
    Preconditions.checkNotNull(function, "WindowFunction cannot be null");  
  
    if (reduceFunction instanceof RichFunction) {  
        throw new UnsupportedOperationException(  
                "ReduceFunction of apply can not be a RichFunction.");  
    }  
  
    if (evictor != null) {  
        return buildEvictingWindowOperator(  
                new InternalIterableWindowFunction<>(  
                        new ReduceApplyWindowFunction<>(reduceFunction, function)));  
    } else {  
        ReducingStateDescriptor<T> stateDesc =  
                new ReducingStateDescriptor<>(  
                        WINDOW_STATE_NAME, reduceFunction, inputType.createSerializer(config));  
  
        return buildWindowOperator(  
                stateDesc, new InternalSingleValueWindowFunction<>(function));  
    }  
}

到了这里,关于Flink window 源码分析1:窗口整体执行流程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringMVC的执行流程与源码分析

    通过深入分析Spring MVC的源码,我们可以更好地理解其工作原理和内部机制。这有助于我们更好地使用该框架进行Web应用程序的开发,并解决实际开发中遇到的问题。同时,对于学习和研究Spring MVC框架的人来说,阅读源码并进行分析也是一种重要的学习和提升手段。 Spring MV

    2024年01月21日
    浏览(31)
  • 【SpringMVC】| SpringMVC执行流程(含源码分析)

    目录 SpringMVC执行流程 1. SpringMVC常用组件 2. DispatcherServlet初始化过程(源码分析) 3. DispatcherServlet调用组件处理请求 4. SpringMVC的完整执行流程 图书推荐:Spring Cloud Alibaba核心技术与实战案例 1.  SpringMVC常用组件 (1) DispatcherServlet: 前端控制器 ,不需要工程师开发,由框架

    2024年02月13日
    浏览(28)
  • mybatis源码学习之mybatis执行流程分析

    mybatis全局配置文件中涉及的标签如下图所示 下面我们来进行源码分析。 配置文件的解析创建SqlSessionFactory 配置文件的解析主要涉及到的类如下:XMLConfigBuilder、XPathParser、XPath、XNode,其中XPath、XNode是对 1、build方法内部首先会根据输入流等信息创建XMLConfigBuilder类的实例对象,

    2024年02月07日
    浏览(35)
  • 【Mybatis源码解析】mapper实例化及执行流程源码分析

    基础环境:JDK17、SpringBoot3.0、mysql5.7 储备知识:《【Spring6源码・AOP】AOP源码解析》、《JDBC详细全解》 基于SpringBoot的Mybatis源码解析: 1.如何对mapper实例化bean 在加载BeanDefinition时,会将SqlSessionFactory、SqlSessionTemplate、MapperScannerConfigurer加载到注册表中,以供后续进行实例化。

    2024年02月01日
    浏览(27)
  • 【Android12】Monkey压力测试源码执行流程分析

    Monkey是Android提供的用于应用程序自动化测试、压力测试的测试工具。 其源码路径(Android12)位于 部署形式为Java Binary 通过Monkey,可以模拟用户的Touch(单指、多指、手势)、按键(key)事件等,检测应用程序发生的ANR、Crash事件,并收集相关Debug信息等。 例如测试应用com.packa

    2024年03月22日
    浏览(29)
  • 【源码分析】一个flink job的sql到底是如何执行的(一):flink sql底层是如何调用connector实现物理执行计划的

    我们以一条sql为例分析下flink sql与connector是如何配合执行的,本文我们先分析 sql-sqlnode-validate-operation:是如何找到对应的connector实例的 relnode-execGraph:是如何组装node为Graph,在哪找到connector实例的 之后的文章将会继续分析: translateToPlanInternal是如何串联connector其他方法的

    2024年01月16日
    浏览(30)
  • Flink window 源码分析4:WindowState

    本文源码为flink 1.18.0版本。 其他相关文章: Flink window 源码分析1:窗口整体执行流程 Flink window 源码分析2:Window 的主要组件 Flink window 源码分析3:WindowOperator Flink window 源码分析4:WindowState 主要考虑 reduce、aggregate 函数中的托管状态是在什么时候触发和使用的?使用时与Win

    2024年01月25日
    浏览(32)
  • 【源码分析】XXL-JOB的执行器的注册流程

    目的:分析xxl-job执行器的注册过程 流程: 获取执行器中所有被注解( @xxlJjob )修饰的 handler 执行器注册过程 执行器中任务执行过程 版本: xxl-job 2.3.1 建议:下载 xxl-job 源码,按流程图 debug 调试, 看堆栈信息并按文章内容理解执行流程 。 完整流程图: 部分流程图: 首先启

    2023年04月22日
    浏览(29)
  • Vue2源码梳理:update的整体实现流程

    update 回到之间 $mount时,mountComponent 函数的过程,vm._render 是如何创建了一个 VNode 接下来就是要把这个 VNode 渲染成一个真实的 DOM 并渲染出来,这个过程是通过 vm._update 完成的 _update 它是一个vue 的私有方法,它把我们的 vnode 渲染成真实的 dom _update的方法,也是原型上的一个方

    2024年02月20日
    浏览(26)
  • React16源码: React中的schedule调度整体流程

    schedule调度的整体流程 React Fiber Scheduler 是 react16 最核心的一部分,这块在 react-reconciler 这个包中 这个包的核心是 fiber reconciler,也即是 fiber 结构 fiber 的结构帮助我们把react整个树的应用,更新的流程,能够拆成每一个 fiber 对象为单元的一个更新的流程 这种单元的形式把更新

    2024年01月19日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包