Flink 内核原理与实现-应用(下)

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
简介: Flink 内核原理与实现-应用
  • Fold

       Fold与Reduce类似,区别在于Fold是一个提供了初始值的Reduce,用初始值进行合并运算。该类运算应用在KeyedStream上,输出结果为DataStream。Folder接口对应的是FoldFunction,其类泛型为FoldFunction<O,T>,O为KeyStream中的数据类型,T为初始值类型和Fold方法返回值类型。


640.png


FoldFunction<O,T>已经被标记为Deprecated废弃,替代接口是AggregateFunction<IN,ACC,OUT>。


640.png


  • Aggregation

       渐进聚合具有相同Key的数据流元素,以min和minBy为例,min返回的是整个KeyedStream的最小值,按照Key进行分组,返回每个组的最小值。聚合运算输出结果为DataStream。


a1530f9427a8ee8e005ef0a045385fae.png


  • Window

       对KeyedStream数据,按照Key进行时间窗口切分。输出结果为WindowedStream。输出结果的类泛型为<T,K,W extends Window>,T为KeyedStream中的元素数据类型,K为指定Key的数据类型,W为窗口类型。


565bb83b5064bbb930319f07704bb79a.png


  • WindowAll

       对一般的DataStream进行窗口切分,即全局一个窗口。输出结果为AllWindowedStream。


846ae4b04accf658ad4c5d623c7f6f75.png


        注意:在一般的DataStream上进行窗口切分,往往会导致无法并行计算,所有的数据都集中在WindowAll算子的一个Task上。


  • Window Apply

       将Window函数应用到窗口上,Window函数将一个窗口的数据作为整体进行处理。Window Stream有两种:分组后的WindowedStream和未分组的AllWindowedStream。


       1、WindowedStream

           WindowedStream上应用的是WindowFunction,输出结果为DataStream。WindowFunction<IN,OUT,KEY,W extends Window>中IN表示输入值的类型,OUT表示输出值的类型,KEY表示Key的类型,W表示窗口的类型。


c49b0ebb9225d7f0ddf0e94bd85abf3a.png


       2、AllWindowedStream

           AllWindowedStream上应用的是AllWindowFunction,输出结果为DataStream。AllWindowFunction<IN,OUT,KEY,W extends Window>中IN表示输入值的类型,OUT表示输出值的类型,KEY表示Key的类型,W表示窗口的类型。


f8a8c3b65cdd00d795ee5b7a7d267323.png


  • Window Reduce

       在WindowedStream上应用ReduceFunction,结果输出为DataStream。


4e6f2eae2baf89122ffcb25a33b29080.png


  • Window Fold

       在WindowedStream上应用FoldFunction,结果输出为DataStream。


558b2c71d8a68ecd39dc778901fa863a.png


  • Window Aggregation

       统计聚合运算,在WindowedStream应用该运算,应用AggregationFunction,输出结果为DataStream。


3a9caef956503f5795bc126975870ed8.png


  • Union

       把两个或多个DataStream合并,所有DataStream中的元素都会组合成一个新的DataStream,但是不去重,如果在自身上应用Union运算,则每个元素在新的DataStram出现两次。


783a9ebb85ee1bbc157ad245eb21e8c8.png


  • Window Join

       在相同时间范围的窗口上Join两个DataStream数据流,输出结果为DataStream。Join核心逻辑在JoinFunction<IN1,IN2,OUT>中实现,IN1为第一个DataStream中的数据类型,IN2为第二个DataStream中的数据类型,OUT为Join结果的数据类型。


4417b773b5ed93e91173238e6a47b531.png


  • Interval Join

       对两次KeyedStream进行Join,需要指定时间范围和Join时使用的Key,输出结果为DataStream。Join的核心逻辑在ProcessJoinFunction<IN1,IN2,OUT>中实现,IN1为第一个DataStream中的元素数据类型,IN2为第2个DataStream中的元素数据类型,OUT为结果输出类型。


64dcd4c3ac78c9811d62163acf6fc66c.png


  • WindowCoGroup

       两个DataStream在相同时间窗口上应用CoGroup运算,输出结果为DataStream,CoGroup和Join功能类似,CoGroup接口对应的是CoGroupFunction,其类泛型为CoGroupFunction<IN1,IN2,O>,IN1代表第一个DataStream中是元素类型,IN2代表第二个DataStream中是元素类型,O为输出结果类型。


8f13777e525e8a560f6a7a86e3901395.png


  • CoMap和CoFlatMap

       在ConnectedStream上应用Map和FlatMap运算,输出流为DataStream。其基本逻辑类似于在一般DataStream上的Map和FlatMap运算,区别在于CoMap转换有2个输入,Map转换有1个输入,CoFlatMap同理。


0b76fd6bb0d97ebd49a6b2624d710899.png

a280022f517264a5a679c3ee3a37cf0c.png


  • Split

       将DataStream按照条件切分多个DataStream,输出流为SplitDataStream。该方法已经标记为废弃,推荐使用SideOutput。


3d1ea846ec982138c008f9ae34b22ac4.png


  • Select

       Select与Split运算配合使用,在Split运算中切分的多个DataStream中,Select用来选择其中某一个具体的DataStream。


7ceee75b8a3ef4d1fc63985853bb51d5.png


  • Iterate

       在API层面上,对DataStream应用迭代会生成1个IteractiveStream,然后在IteractiveSteram应用业务处理逻辑,最终生成一个新的DataStream,在数据流中创建一个迭代循环,将下游的输出发送给上游重新处理。


24102334deb16045bc867ba7a04fc867.png


  • Extract Timestamps

       从记录中提取时间戳,并生成WaterMark。该类运算不会改变DataStram。


eec103bf94d7b6087ad4396388fa8670.png


  • Project

       该类运算只适用于Tuple类型的DataStream,使用Project选取子Tuple,可以选择Tuple的部分元素,可以改变元素顺序,类似于SQL语句中的Select子句,输出流仍然是DataStream。


0f47270d55b48b51a6c491043db43e2d.png


4.3 旁路输出


       旁路输出在Flink中叫做SideOutput,类似于DataStream#split,本质上是一个数据流的切分行为,按照条件将DataStream切分为多个子数据流,子数据流叫做旁路输出数据流。每个旁路输出数据流可以有自己的下游处理逻辑。

0e4a485df32851e16a1d65cb4f8ad57c.png

旁路输出数据流的数据类型可以与上游数据流不同,多个旁路输出数据流的数据类型也不必相同。


如何使用旁路输出:


1、定义OutputTag,OutpuTag是每一个下游分支的标识。


ce95f4a0d820217bf915b45734d61bdf.png

0d4f27258b60942f8b913928ef3990bd.png


2、获取旁路输出


79408ea0430be8c792fd1f96db4d25ca.png


接下来Flink核心篇,如果对Flink感兴趣或者正在使用的小伙伴,可以加我入群一起探讨学习。

相关实践学习
基于Hologres轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
Linux入门到精通
本套课程是从入门开始的Linux学习课程,适合初学者阅读。由浅入深案例丰富,通俗易懂。主要涉及基础的系统操作以及工作中常用的各种服务软件的应用、部署和优化。即使是零基础的学员,只要能够坚持把所有章节都学完,也一定会受益匪浅。
相关文章
|
23天前
|
分布式计算 数据处理 Apache
Spark和Flink的区别是什么?如何选择?都应用在哪些行业?
【10月更文挑战第10天】Spark和Flink的区别是什么?如何选择?都应用在哪些行业?
114 1
|
29天前
|
SQL 消息中间件 分布式计算
大数据-124 - Flink State 01篇 状态原理和原理剖析:状态类型 执行分析
大数据-124 - Flink State 01篇 状态原理和原理剖析:状态类型 执行分析
62 5
|
29天前
|
消息中间件 监控 Java
大数据-109 Flink 体系结构 运行架构 ResourceManager JobManager 组件关系与原理剖析
大数据-109 Flink 体系结构 运行架构 ResourceManager JobManager 组件关系与原理剖析
56 1
|
29天前
|
存储 SQL 分布式计算
大数据-127 - Flink State 04篇 状态原理和原理剖析:状态存储 Part2
大数据-127 - Flink State 04篇 状态原理和原理剖析:状态存储 Part2
17 0
|
29天前
|
存储 消息中间件 大数据
大数据-126 - Flink State 03篇 状态原理和原理剖析:状态存储 Part1
大数据-126 - Flink State 03篇 状态原理和原理剖析:状态存储 Part1
51 0
|
29天前
|
存储 SQL 分布式计算
大数据-125 - Flink State 02篇 状态原理和原理剖析:广播状态
大数据-125 - Flink State 02篇 状态原理和原理剖析:广播状态
40 0
|
29天前
|
消息中间件 NoSQL Kafka
大数据-116 - Flink DataStream Sink 原理、概念、常见Sink类型 配置与使用 附带案例1:消费Kafka写到Redis
大数据-116 - Flink DataStream Sink 原理、概念、常见Sink类型 配置与使用 附带案例1:消费Kafka写到Redis
107 0
|
3月前
|
机器学习/深度学习 监控 Serverless
Serverless 应用的监控与调试问题之Flink在内部使用的未来规划,以及接下来有什么打算贡献社区的创新技术
Serverless 应用的监控与调试问题之Flink在内部使用的未来规划,以及接下来有什么打算贡献社区的创新技术
|
3月前
|
机器学习/深度学习 监控 大数据
Serverless 应用的监控与调试问题之Flink在整个开源大数据生态中应该如何定位,差异化该如何保持
Serverless 应用的监控与调试问题之Flink在整个开源大数据生态中应该如何定位,差异化该如何保持
|
消息中间件 监控 Java
从零编写第一个 Flink 应用
Apache Flink 是一个流计算引擎。本文主要介绍如何从零编写一个统计单词出现次数的 Flink 应用(后面简称为 WordCount)。由于 Flink 概念很多,对初学者会造成极大困扰,所以本文不会涉及太多概念,即使没有 Flink 基础也可以完成本文的示例应用。
297 0
从零编写第一个 Flink 应用