flink前三章读书笔记
2021-10-15 17:37:03 0 举报
AI智能生成
aaa
作者其他创作
大纲/内容
Google Streaming101/102
流式计算论文基础
流为核心,批是流的特例。
流批一体
与集群管理器集成,利用YARN、K8s来做到AM级别的容错
高可用性设置ZK,JM高可用
集群级容错
一致性
轻量级
基于Ckeckpoint来实现高可用
应用级容错
可靠的容错能力
Flink借助轻量级分布式快照机制,能够定时生成分布式快照,并将快照保存到外部存储中。
高吞吐、低延迟
大规模复杂计算
flink自身抽象出Resourcemanager用来管理flink最细粒度的资源slot
多平台部署
核心特点
分支主题
DAG抽象
数据处理
作业调度
容错
内存管理、数据序列化
数据交换
运行时层
Standalone模式
Yarn、Mesos、K8s
云上模式
部署层
技术架构
JobManager
TaskManager接收JobManager分发的子任务,根据自身的资源情况,管理子任务的启动、停止、销毁、异常恢复等生命周期阶段。
TaskManager
运行架构
架构
Flink入门
Flink的作业中的DataStream API调用,实际上构建了多个由Transformation组成的数据处理流水线(Pipeline)
Flink应用开发
Datastream转换
ProcessFunction KeyedProcessFunction CoProcessFunction ProcessWindowFunction ProcessAllWindowFunction ProcessJoinFunction KeyedCoProcessFunction
OutputTag适用算子
Flink应用
StreamingRuntimeContext:在流计算UDF中使用的上下文,用来访问作业信息、状态等。
DistributedRuntimeUDFContext:由运行时UDF所在的批处理算子创建,在DataSet批处理中使用。
RuntimeUDFContext:在批处理应用的UDF中使用。
SavepointRuntimeContext:Flink1.9版本引入了一个很重要的状态处理API,这个框架支持对检查点和保存点进行操作,包括读取、变更、写入等。
CepRuntimeContext:CEP复杂事件处理中使用的上下文。
UDF中使用RuntimeContext
main方法中使用StreamExecutionEnvironment
环境对象
StreamRecord表示数据流中的一条记录(或者叫作一个事件),也叫作数据记录。
数据的值本身。
事件戳(可选)。
StreamRecord
LatencyMarker用来近似评估延迟,LatencyMarker在Source中创建,并向下游发送,绕过业务处理逻辑,在Sink节点中使用LatencyMarker估计数据在整个DAG图中流转花费的时间,用来近似地评估总体上的处理延迟。
周期性地在数据源算子中创造出来的时间戳。
算子编号。
数据源算子所在的Task编号。
LatencyMarker
Watermark是一个时间戳,用来告诉算子所有时间早于等于Watermark的事件或记录都已经到达,不会再有比Watermark更早的记录,算子可以根据Watermark触发窗口的计算、清理资源等。后边有详细介绍。
Watermark
用来通知Task是否会继续接收到上游的记录或者Watermark。StreamStatus在数据源算子中生成,向下游沿着Dataflow传播。
空闲状态(IDLE)。
活动状态(ACTIVE)
StreamStatus
数据流元素
算子在Flink中叫作StreamOperator。StreamOperator是流计算的算子。
setup:初始化环境、时间服务、注册监控等。
open:该行为由各个具体的算子负责实现,包含了算子的初始化逻辑,如状态初始化等。算子执行该方法之后,才会执行Function进行数据的处理。
close:所有的数据处理完毕之后关闭算子,此时需要确保将所有的缓存数据向下游发送。
dispose:该方法在算子生命周期的最后阶段执行,此时算子已经关闭,停止处理数据,进行资源的释放。
生命周期管理
算子负责状态管理,提供状态存储,触发检查点的时候,保存状态快照,并且将快照异步保存到外部的分布式存储。当作业失败的时候算子负责从保存的快照中恢复状态。
状态与容错管理
算子对数据的处理,不仅会进行数据记录的处理,同时也会提供对Watermark和LatencyMarker的处理。
算子行为
InnerHashJoinOperator
BuildOuterHashJoinOperator
BuildLeftSemiOrAntiHashJoinOperator
ProbeOuterHashJoinOperator
FullOuterHashJoinOperator
AntiHashJoinOperator
SemiHashJoinOperator
HashJoin
TemporalProcessTimeJoinOperator
TemporalRowTimeJoinOperator
维表Join(Lookup Join)
Join
Sort算子
BufferDataOverWindowOperator:Over开窗运算经常需要用当前数据跟之前N条数据一起计算,所以需要采用将之前的数据缓存起来的方式,在内存不足的情况下会自动溢出到磁盘。
NonBufferOverWindowOperator:该算子应用于rank等不需要跟之前N条数据一起计算的开窗运算,无须缓存数据,可以提高计算效率。
OverWindow算子
AggregateWindowOperator:使用普通聚合函数(UDAF)的窗口算子。
TableAggregateWindowOperator:使用表聚合函数(UDTAF)的窗口算子。
Window算子
WatermarkAssignerOperator:从数据元素中提取时间戳,周期性地生成Watermark。
RowTimeMiniBatchAssignerOperator:用在mini-batch模式下,依赖上游的Watermark,基于事件时间周期性地生成Watermark。
ProcTimeMiniBatchAssignerOperator:用在mini-batch模式下,基于处理时间周期性地生成Watermark,不依赖上游。
Watermark算子
Mini-batch算子用微批来提升计算效率,提高吞吐量。使用Java的Map来缓存数据,Map的Key与State的Key保持一致,在进行聚合运算的时候可以批量操作,避免每一条数据都访问State。
MapBundleOperator:应用于未按照Key分组的数据流。
KeyedMapBundleOperator:应用于按照Key分组后的数据流,即KeyedStream。
Mini-batch算子
Blink内置算子
SortOperator:实现批上的全局数据排序。
SortLimitOperator:实现批上的带有Limit的排序。
LimitOperator:实现批上的limit语义。
RankOperator:实现批上的Top N语义。
批上算子
Blink算子
算子
实时流Join
延时流Join
延迟计算
生命周期管理:在实际中,一般SourceFunction的实现类会同时继承AbstractRichFunction,所以其生命周期包含open、close、cancle三种方法,在生命周期方法中可以包含相应的初始化、清理等。
读取数据: 持续地从外部存储读取数据,不同的外部存储有不同的实现,如从Kafka读取数据依赖于Kafka Producer等。
向下游发送数据。
发送Watermark:生成Watermark并向下游发送
空闲标记:如果读取不到数据,则将该Task标记为空闲,向下游发送Status#Idle,阻止Watermark向下游传递。
SourceFunction
数据源函数
函数体系
自定义分区
该Partitioner比较特殊,用于在同一个OperatorChain中上下游算子之间的数据转发,实际上数据是直接传递给下游的。
ForwardPartitioner
随机将元素进行分区,可以确保下游的Task能够均匀地获得数据
ShufflePartitioner
以Round-robin的方式为每个元素分配分区,确保下游的Task可以均匀地获得数据,避免数据倾斜
ReblancePartitioner
根据上下游Task的数量进行分区。使用Round-robin选择下游的一个Task进行数据分区,如上游有2个Source,下游有6个Map,那么每个Source会分配3个固定的下游Map,不会向未分配给自己的分区写入数据。这一点与ShufflePartitioner和ReblancePartitioner不同,后两者会写入下游所有的分区
RescalingPartitioner
将该记录广播给所有分区,即有N个分区,就把数据复制N份,每个分区1份
BroadcastPartitioner
KeyedStream根据KeyGroup索引编号进行分区,该分区器不是提供给用户来用的。
KeyGroupStreamPartitioner
数据分区
分布式ID
核心抽象
前三章读书笔记
0 条评论
回复 删除
下一页