Flink学习笔记
2023-03-03 17:21:42 0 举报
AI智能生成
个人Flink学习笔记,持续更新中......
作者其他创作
大纲/内容
基本概念
Stream执行环境
任务的执行计划
//获取执行计划
System.out.println(environment.getExecutionPlan());
Flink 中的执行图可以分成四层:StreamGraph -> JobGraph -> ExecutionGraph -> 物理执
行图。
行图。
1. StreamGraph
根据用户通过 Stream API 编写的代码生成的最初的图。用来表示程序的拓扑结构
2. JobGraph
StreamGraph经过优化后生成了 JobGraph,提交给 JobManager 的数据结构。主要的
优化为,将多个符合条件的节点 chain 在一起作为一个节点,这样可以减少数据在节点
之间流动所需要的序列化/反序列化/传输消耗
3. ExecutionGraph
JobManager 根据 JobGraph 生成ExecutionGraph。
ExecutionGraph是JobGraph的并行化版本,是调度层最核心的数据结构。
4. 物理执行图
JobManager 根据 ExecutionGraph 对 Job 进行调度后,在各个TaskManager 上部署
Task 后形成的“图”
并不是一个具体的数据结构
任务并行度
并行度设置
Flink操作链
好处:
在分布式环境下,Flink将操作的子任务链在一起组成一个任务,每一个任务在一个线程中执行。
将操作链在一起是一个不错的优化:它减少了线程间的切换和缓冲,提升了吞吐量同时减低了时
延。
条件
上下游算子实例间是 oneToOne 数据传输(forward);
上下游算子并行度相同;
上下游算子属于相同的 slotSharingGroup(槽位共享组)
操作
// 当前环境关闭操作链..
environment.disableOperatorChaining();
//单个算子关闭操作链
Stream.disableChaining()
Spark与Flink的区别
数据模型
Spark:RDD
Flink: DataStream
数据驱动
Spark: 一个个RDD组成的集合
Flink: 基于Event驱动
架构
Flink:流式处理
是标准的流执行模式,一个事件在一个节点处理完可以直接发往下一个节点进行处理,并且可以并行处理
Flink 在运行时主要包含:Jobmanager、Taskmanager和Slot。
Spark:批处理(伪实时,微批次)
将DAG划分为不同的Stage,一个完成后才可以计算下一个
Spark在运行时的主要角色包括:Master、Worker、Driver、Executor。
任务调度不同
flink:Flink 根据用户提交的代码生成 StreamGraph,经过优化生成 JobGraph,然后提交给 JobManager进行处理,JobManager 会根据 JobGraph 生成 ExecutionGraph,ExecutionGraph 是 Flink 调度最核心的数据结构,JobManager 根据 ExecutionGraph 对 Job 进行调度。
spark:Spark Streaming 连续不断的生成微小的数据批次,构建有向无环图DAG,根据DAG中的action操作形成job,每个job有根据窄宽依赖生成多个stage。
容错机制不同
flink:Flink 则使用两阶段提交协议来保证exactly once。
spark:Spark Streaming的容错机制是基于RDD的容错机制,会将经常用的RDD或者对宽依赖加Checkpoint。利用SparkStreaming的direct方式与Kafka可以保证数据输入源的,处理过程,输出过程符合exactly once。
吞吐量与延迟不同
flink:Flink是基于事件的,消息逐条处理,而且他的容错机制很轻量级,所以他能在兼顾高吞吐量的同时又有很低的延迟,它的延迟能够达到毫秒级;
spark:spark是基于微批的,而且流水线优化做的很好,所以说他的吞入量是最大的,但是付出了延迟的代价,它的延迟是秒级;
状态不同
flink:flink是事件驱动型应用是一类具有状态的应用,我们要把它看成一个个event记录去处理,当遇到窗口时会进行阻塞等待,窗口的聚合操作是无状态的。过了窗口后DataStream的算子聚合操作就是有状态的操作了,所以flink要把聚合操作都放到窗口操作之前,才能进行无状态的聚合操作。而spark全程都是无状态的,所以在哪聚合都可以。
spark:spark本身是无状态的,所以我们可以把它看成一个rdd一个算子一个rdd的去处理,就是说可以看成分段处理。
flink提交任务
WebUI
命令行提交
env的三种创建方式
批处理运行环境
ExecutionEnvironment.getExecutionEnvironment()
流式计算运行环境
StreamExecutionEnvironment.getExecutionEnvironment()
本地web ui环境
StreamExecutionEnvironment.createLocalEnvironmentWithWebUI(new
Configuration()); 默认8081,可以根据new Configuration()设置
Configuration()); 默认8081,可以根据new Configuration()设置
Source
common
基于文件
readTextFile(path) - 读取文本文件,例如遵守 TextInputFormat 规范的文件,逐行读取并将
它们作为字符串返回。
它们作为字符串返回。
readFile(fileInputFormat, path) - 按照指定的文件输入格式读取(一次)文件。
readFile(fileInputFormat, path, watchType, interval, pathFilter, typeInfo) - 这
基于套接字
socketTextStream - 从套接字读取。元素可以由分隔符分隔。
在启动 Flink 程序之前, 必须先启动一个 Socket 服务
DataStreamSource<String> lineStream =
environment.socketTextStream("localhost", 19523);
基于集合
fromCollection(Collection) - 从 Java Java.util.Collection 创建数据流。集合中的所有元素必
须属于同一类型。
fromCollection(Iterator, Class) - 从迭代器创建数据流。class 参数指定迭代器返回元素的
数据类型。
fromElements(T ...) - 从给定的对象序列中创建数据流。所有的对象必须属于同一类型。
fromParallelCollection(SplittableIterator, Class) - 从迭代器并行创建数据流。class
generateSequence(from, to) - 基于给定间隔内的数字序列并行生成数据流。
Connectors
flink内置的 Connector
自定义source
ParallelSourceFunction 与 RichParallelSourceFunction
SourceFunction 与 RichSourceFunction
Transformation
map
flatmap
keyby
filter
reduce
Iterate
union
connect
aggregation
sum
min
minBy
max
maxBy
Sink算子
什么是Sink算子?
为什么要用Sink算子?
Sink算子有哪些?
输出到控制台 print
输出到文件(大部分被弃用)
输出到服务器
writeToSocket
将计算结果输出到某台机器的端口上。
基于Connectors
自定义Sink
实现SinkFunction接口
继承RichSinkFunction类
怎么用Sink算子?
Partitioner类算子
Partitioner类算子是什么?
为什么要用Partitioner类算子?
什么时候用Partitioner类算子?
Partitioner类算子怎么用?
Partitioner类算子有哪些?
GlobalPartitioner
所有上游算子的数据发送到下游第一个算子实例上
RebalancePartitioner
上一个每个算子轮询发往下游的算子实例上
RescalePartitioner
根据上下游算子的并行度,循环的方式发往下游的每个算子实例上
ShufflePartitioner
随机的选择下游的算子实例进行发送
BroadcastPartitioner
将上游算子的数据输出到下游的每个算子实例上,比较适合大数据集join小数据集的场景
ForwardPartitioner
发送到下游对应的第一个task上,要求上下游算子并行度相同
KeyGroupStreamPartitioner
上游算子按照key的hash值发往下游算子实例中
CustomPartitioner
用户自定义实现分区器,实现Partation接口,重写patation方法
窗口与窗口函数
什么是窗口?什么是窗口函数?
窗口的分类
按照驱动类型划分
时间窗口
缺点:存在乱序导致的误差
计数窗口
缺点:当数据的大小达不到时,它永远没法出来
按照窗口分配数据的规则分类
滚动窗口(用的最多)(一种特殊的滑动窗口)
只需要一个参数
滑动窗口
两个参数
会话窗口 (Session Windows)
基于超时时间来定义
窗口函数
增量聚合函数
RecudeFunction
AggregateFunction(比较常用,可以灵活传参,没有RecudeFunction限制的那么死,一般传三个参数)
全窗口聚合函数
WindowFunction
(较老,一般不用)
(较老,一般不用)
ProcessWindowFunction
区别:一个是每来一条就处理一条,一个是数据全部来了再处理
为什么要用窗口?
窗口,窗口函数怎么用?
窗口API调用分类
按键分区窗口(常用)
代码: stream.keyBy(<KeySelector>)
.window(<window assigner>) 窗口分配器,指明窗口的类型
.aggregate(<window function>)
.window(<window assigner>) 窗口分配器,指明窗口的类型
.aggregate(<window function>)
非按键分区(不推荐)
代码: stream.windowAll(<window assigner>) 窗口分配器,指明窗口的类型
.aggregate(<window function>)
.aggregate(<window function>)
处理函数
什么是处理函数(ProcessFunction)?
为什么要用处理函数?
处理函数怎么用?
处理函数有哪些?
ProcessFunction
最基本的处理函数,基于 DataStream 直接调用.process()时作为参数传入。
KeyedProcessFunction
对流按键分区后的处理函数,基于 KeyedStream 调用.process()时作为参数传入。要想使用
定时器,比如基于 KeyedStream。
ProcessWindowFunction
开窗之后的处理函数,也是全窗口函数的代表。基于 WindowedStream 调用.process()时作
为参数传入。
ProcessAllWindowFunction
同样是开窗之后的处理函数,基于 AllWindowedStream 调用.process()时作为参数传入
CoProcessFunction
合并(connect)两条流之后的处理函数,基于 ConnectedStreams 调用.process()时作为参
数传入。关于流的连接合并操作
ProcessJoinFunction
间隔连接(interval join)两条流之后的处理函数,基于 IntervalJoined 调用.process()时作
为参数传入。
BroadcastProcessFunction
广播连接流处理函数,基于 BroadcastConnectedStream 调用.process()时作为参数传入。
这里的“广播连接流”BroadcastConnectedStream,是一个未 keyBy 的普通 DataStream 与
一个广播流(BroadcastStream)做连接(conncet)之后的产物。
KeyedBroadcastProcessFunction
按键分区的广播连接流处理函数,同样是基于 BroadcastConnectedStream 调用.process()
时作为参数传入。
与 BroadcastProcessFunction 不同的是,这时的广播连接流,是一个 KeyedStream与广播
流(BroadcastStream)做连接之后的产物。
水位线(WaterMark)
什么是水位线?
1. 水位线是Flink流处理中保证结果正确性的核心机制
2.在事件时间的语义下,不依赖系统时间,而是基于数据自带的时间戳去定义一个时钟,用来表示当前时间的进展。
3.水位线其实可以理解是一个特俗的数据,用来延迟窗口的触发(此处指的窗口每个相互独立)
水位线公式:watermark=当前最大事件时间-延迟时间
为什么要用水位线?
水位线的主要作用是解决数据的延迟和乱序问题
水位线怎么用 ?
内置水位线生成器
自定义水位线
水位线的传递
广播水位线(水位线的分区传递,多流合流也适用)
图解:
简述:
水位线是由上线任务广播到下游任务,下游的并行任务会接收到同一份水位线信息,多个上游任务的水位线不同时,选择其中最小的那个水位线,下游任务会缓存上游每个任务的最新水位线 ,取更新后最小的水位线发送出去
Flink CEP
Flink CEP是什么?
复杂事件处理(Complex Event Processing),就是Flink实现的一个用于复杂事件处理的库(library)
Flink CEP怎么用?
1. 引入相关依赖
典型应用场景
风险控制(应用最为广泛)
用户画像
运维监控
Flink 状态管理机制
Flink 容错机制
0 条评论
下一页