Apache Flink源码解析之stream-operator

本文详细解析了Apache Flink中的StreamOperator,包括StreamSource、OneInputStreamOperator、TwoInputStreamOperator及其辅助实现类。重点介绍了不同类型的Context,如NonTimestampContext、AutomaticWatermarkContext,以及Operator的生命周期方法和内置的Operator实现,如StreamCounter、StreamFilter、StreamMap等,揭示了Flink运行时的动态表现形式。
摘要由CSDN通过智能技术生成

前面我们谈论了Flink stream中的transformation。你可以将transformation看成编写Flink程序并构建流式处理程序的必要组成部分(静态表现形式);而本篇我们将探讨transformation在Flink运行时对应的动态表现形式——operator。他们之间的映射关系见下图:

flink-stream-operator_transformation-operator

具体的探讨可以查看前文:Flink中的一些核心概念

StreamOperator

所有operator的最终基类,operator的分类方式,按照输入流个数不同分为:

  • 无输入:StreamSource
  • 单个流输入:OneInputStreamOperator
  • 两个流输入:TwoInputStreamOperator

跟生命周期有关的核心抽象方法:

  • setup : 实例化operator
  • open :该方法会在任何元素被处理之前执行,它的实现通常包含了operator的初始化逻辑
  • close :该方法在所有的元素都进入到operator被处理之后调用
  • dispose :该方法在operator生命周期的最后阶段执行,主要用于回收资源

StreamOperator及其实现类中还包含了一些状态恢复与保存相关的逻辑,但这些不是本文的主题,所有暂时不做探讨。

先来看一下整个package的类关系图:

flink-stream-operator_all-class-diagram

我们整个剖析方式大致也按照以上operator的分类方式以及类的层次结构来。

StreamSource

作为一个流处理DAG的起点,source operator相比其他operator无疑是特别的(从类的继承关系图也可以看出来)。

它需要接受SourceFunction的实例。并且我们可以看到,它的chaining strategyHEAD(它表示operator不能有前置operator,但可以作为其他operator的前置operator,下文会谈到)。

this.chainingStrategy = ChainingStrategy.HEAD;

StreamSource的实现略显复杂,因为它涉及到我们前面文章谈SourceFunction时谈到的SourceFunction.SourceContext的实现。在这里提供了三个实现,分别对应我们之前谈到的Flink对事件时间的三个分类:

flink-stream-operator_streamsource

  • NonTimestampContext:针对ProcessingTime,该SourceContext将时间戳设置为-1,并且不发射watermark
  • AutomaticWatermarkContext:针对IngestionTime,提供自动的watermark发射机制的SourceContext
  • ManualWatermarkContext:针对EventTime的人工发射watermarkSourceContext

它们之间的对应关系也体现在其run方法的实现中:

        switch (timeCharacteristic) {
            case EventTime:
                ctx = new ManualWatermarkContext<>(this, lockingObject, collector);
                break;
            case IngestionTime:
                ctx = new AutomaticWatermarkContext<>(this, lockingObject, collector,
                        getRuntimeContext().getExecutionConfig().get
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值