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