Apache Flink源码解析之stream-transformation

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: 之前我们聊了Flink程序的source、sink就差transformation了。今天我们就来解读一下Flink的transformation。它们三者的关系如下图: 当然这还是从Flink编程API的角度来看的(编程视角)。

之前我们聊了Flink程序的sourcesink就差transformation了。今天我们就来解读一下Flink的transformation。它们三者的关系如下图:

flink-stream-transformation_relationship

当然这还是从Flink编程API的角度来看的(编程视角)。所谓的transformation,用于转换一个或多个DataStream从而形成一个新的DataStream对象。Flink提供编程接口,允许你组合这些transformation从而形成非常灵活的拓扑结构。

StreamTransformation

StreamTransformation是所有transformation的抽象类,提供了实现transformation的基础功能。每一个DataStream都有一个与之对应的StreamTransformation

一些API操作,比如DataStream#map,将会在底层创建一个StreamTransformation树,而在程序的运行时,该拓扑结构会被翻译为StreamGraph

StreamTransformation无关运行时的执行,它只是逻辑上的概念。

属性如下:

  • name : 转换器的名称,这个主要用于可视化的目的
  • uid : 用户指定的uid,该uid的主要目的是用于在job重启时可以再次分配跟之前相同的uid,应该是用于持久保存状态的目的。
  • bufferTimeout :buffer超时时间
  • parallelism : 并行度
  • id : 跟属性uid无关,它的生成方式是基于一个静态累加器
  • outputType : 输出类型
  • slotSharingGroup : 给当前的transformation设置slot共享组。slot sharing group用于将并行执行的operator“归拢”到相同的TaskManager slot中(slot概念基于资源的划分,因此这里的目的是让不同的subtask共享slot资源)

其中,StreamTransformation构造器需要的参数是:

  • name
  • outputType
  • parallelism

核心的抽象方法:

  • setChainingStrategy : 设置chaining策略
  • getTransitivePredecessors :返回中间过渡阶段的前置StreamTransformation集合,该方法的可能的应用场景是用来决定在迭代中的feedback edge(反馈边)最终是有前置StreamTransformation

内置的StreamTransformation

因为就一层继承关系的树形结构,所以这里类之间的关系图就不再暂时了

绝大部分StreamTransformation都需要依赖上游StreamTransformation作为输入SourceTransformation等少数特例除外;

如果没有特别说明,getTransitivePredecessors的实现逻辑都是,由自身加input(上游StreamTransformation)组成的集合。

根据实现,我们可以将它们分成两类:

I :输入输出相关,需要自行定义name,都需要与之对应的operatorsetChainingStrategy的实现都返回operator#setChainingStrategy

属于该分类的有:

SourceTransformation
SinkTransformation
OneInputTransformation
TwoInputTransformation

II :内置函数name内部固定,无法更改,无需operatorsetChainingStrategy的实现都只是抛出UnsupportedOperationException异常

属于该分类的有:

除了上面那些,其他所有的transformation

SourceTransformation

它表示一个sorce,它并不真正做转换工作,因为它没有输入,但它是任何拓扑的根StreamTransformation

除了StreamTransformation构造器需要的那三个参数,SourceTransformation还需要StreamSource类型的参数,它是真正执行转换的operator

值得一提的是,其getTransitivePredecessors抽象方法的实现:

    public Collection<StreamTransformation<?>> getTransitivePredecessors() {
        return Collections.<StreamTransformation<?>>singleton(this);
    }

因为其没有前置转换器,所以其返回只存储自身实例的集合对象。

SinkTransformation

它表示一个sink,创建的时候构造器需要operator 它是 StreamSink的实例,是最终做转换的operator

getTransitivePredecessors方法的实现是将自身以及input#getTransitivePredecessors的返回值(之前的StreamTransformation集合)集合

该类有两个特别的属性:

  • stateKeySelector
  • stateKeyType

这两个属性的目的是因为sink的状态也可能是基于key分区的。

OneInputTransformation

接受一种输入的StreamTransformation(换句话说,只接收一个输入流)。跟上面的SinkTransformation构造器类似,需要inputoperator两个参数(只不过这里的operator类型是对应的OneInputStreamOperator)。

TwoInputTransformation

表示接收两种输入的StreamTransformation(接收两种流作为输入)。其他的实现同OneInputTransformation

SplitTransformation

可将其看作分流转换器,该转换用于将一个流拆分成多个流(通过OutputSelector来达到这个目的),当然这个操作只是逻辑上的拆分(它只影响上游的流如何跟下游的流连接)。

构造该转换器,同样也是依赖于其输入转换器(input)以及一个输出选择器(outputSelector),但在实例化其父类(StreamTransformation,没有提供自定义的名称,而是固定的常量值Split

SelectTransformation

该选择转换器用于从上游流中筛选出特定的元素。它在使用时,必须跟随在SplitTransformation之后(SplitTransformation通过指定的名称将元素分配到多个逻辑流中)。

构造SelectTransformation需要前一个转换器作为输入,以及上游用于分流的SplitTransformation所使用的名称。跟SplitTransformation类似,这里也无需提供自定义的转换器名称,而是固定的常量值Select

UnionTransformation

合并转换器,该转换器用于将多个输入StreamTransformation进行合并。因此该转换器接收StreamTransformation的集合。其名称也在内部被固定为Union

PartitionTransformation

该转换器用于改变输入元素的分区,其名称为:Partition。因此,工作时除了提供一个StreamTransformation作为输入,还需要提供一个StreamPartitioner的实例来进行分区。

FeedbackTransformation

该转换器用于表示Flink DAG中的一个反馈点feedback point)。所谓反馈点,可用于连接一个或者多个StreamTransformation,这些StreamTransformation被称为反馈边(feedback edges)。处于反馈点下游的operation将可以从反馈点和反馈边获得元素输入。

反馈转换器的固定名称为Feedback,它的实例化需要两个参数:

  • input : 上游输入StreamTransformation
  • waitTime : feedback operator的等待时间,一旦超过该等待时间,将关闭并不再接收任何反馈元素。

实例化FeedbackTransformation时,会自动创建一个用于存储反馈边的集合feedbackEdges。那么反馈边如何收集呢?FeedbackTransformation通过定义一个实例方法:addFeedbackEdge来进行收集,而这里所谓的“收集”就是将下游StreamTransformation的实例加入feedbackEdges集合中(这里可以理解为将两个点建立连接关系,也就形成了边)。不过,这里加入的StreamTransformation的实例有一个要求:也就是当前FeedbackTransformation的实例跟待加入StreamTransformation实例的并行度一致

某种程度上,你可以将其类比于pub-sub机制

CoFeedbackTransformation

某种程度上跟FeedbackTransformation类似。feedback元素的类型不需要跟上游的StreamTransformation元素的类型一致,因为CoFeedbackTransformation之后只允许跟TwoInputTransformations。上游的StreamTransformation将会连接到TwoInputTransformations第一个输入,而feedback edge将会连接到其第二个输入。因此上游的StreamTransformation其实是跟CoFeedbackTransformation无关的,它跟TwoInputTransformation有关。

上游的StreamTransformationCoFeedbackTransformation无关,从CoFeedbackTransformation构造器需要的参数就可以看出来。通常,其他的StreamTransformation的实现都需要传入上游的StreamTransformation作为其输入。但CoFeedbackTransformation却没有,它只需要上游的并行度:parallelism。另外一个需要的参数是feedbackType

它绝大部分实现跟FeedbackTransformation区别在于getTransitivePredecessors方法的实现。我们之前谈及getTransitivePredecessors主要的应用场景就是用于feedback,而它又不像FeedbackTransformation跟其上游输入有关,所以它只返回了只有当前实例的单元素集合。

小结

本文剖析了Flink中的StreamTransformation实现。当然还没有谈到这些transformation之间是如何串联起来,实现非常灵活的拓扑。这是我们后面会谈论的内容。



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


本文作者:vinoYang


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

相关实践学习
基于Hologres轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
Linux入门到精通
本套课程是从入门开始的Linux学习课程,适合初学者阅读。由浅入深案例丰富,通俗易懂。主要涉及基础的系统操作以及工作中常用的各种服务软件的应用、部署和优化。即使是零基础的学员,只要能够坚持把所有章节都学完,也一定会受益匪浅。
目录
相关文章
|
21天前
|
SQL Java API
Apache Flink 2.0-preview released
Apache Flink 社区正积极筹备 Flink 2.0 的发布,这是自 Flink 1.0 发布以来的首个重大更新。Flink 2.0 将引入多项激动人心的功能和改进,包括存算分离状态管理、物化表、批作业自适应执行等,同时也包含了一些不兼容的变更。目前提供的预览版旨在让用户提前尝试新功能并收集反馈,但不建议在生产环境中使用。
505 13
Apache Flink 2.0-preview released
|
25天前
|
存储 缓存 算法
分布式锁服务深度解析:以Apache Flink的Checkpointing机制为例
【10月更文挑战第7天】在分布式系统中,多个进程或节点可能需要同时访问和操作共享资源。为了确保数据的一致性和系统的稳定性,我们需要一种机制来协调这些进程或节点的访问,避免并发冲突和竞态条件。分布式锁服务正是为此而生的一种解决方案。它通过在网络环境中实现锁机制,确保同一时间只有一个进程或节点能够访问和操作共享资源。
59 3
|
11天前
|
消息中间件 存储 负载均衡
Apache Kafka核心概念解析:生产者、消费者与Broker
【10月更文挑战第24天】在数字化转型的大潮中,数据的实时处理能力成为了企业竞争力的重要组成部分。Apache Kafka 作为一款高性能的消息队列系统,在这一领域占据了重要地位。通过使用 Kafka,企业可以构建出高效的数据管道,实现数据的快速传输和处理。今天,我将从个人的角度出发,深入解析 Kafka 的三大核心组件——生产者、消费者与 Broker,希望能够帮助大家建立起对 Kafka 内部机制的基本理解。
40 2
|
30天前
|
分布式计算 监控 大数据
大数据-148 Apache Kudu 从 Flink 下沉数据到 Kudu
大数据-148 Apache Kudu 从 Flink 下沉数据到 Kudu
52 1
|
29天前
|
数据挖掘 物联网 数据处理
深入探讨Apache Flink:实时数据流处理的强大框架
在数据驱动时代,企业需高效处理实时数据流。Apache Flink作为开源流处理框架,以其高性能和灵活性成为首选平台。本文详细介绍Flink的核心特性和应用场景,包括实时流处理、强大的状态管理、灵活的窗口机制及批处理兼容性。无论在实时数据分析、金融服务、物联网还是广告技术领域,Flink均展现出巨大潜力,是企业实时数据处理的理想选择。随着大数据需求增长,Flink将继续在数据处理领域发挥重要作用。
|
28天前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
62 0
|
28天前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
49 0
|
28天前
|
存储 Java C++
Collection-PriorityQueue源码解析
Collection-PriorityQueue源码解析
58 0
|
28天前
|
安全 Java 程序员
Collection-Stack&Queue源码解析
Collection-Stack&Queue源码解析
72 0
|
8天前
|
消息中间件 缓存 安全
Future与FutureTask源码解析,接口阻塞问题及解决方案
【11月更文挑战第5天】在Java开发中,多线程编程是提高系统并发性能和资源利用率的重要手段。然而,多线程编程也带来了诸如线程安全、死锁、接口阻塞等一系列复杂问题。本文将深度剖析多线程优化技巧、Future与FutureTask的源码、接口阻塞问题及解决方案,并通过具体业务场景和Java代码示例进行实战演示。
27 3

推荐镜像

更多