Flink 流式计算引擎:四大基石
Window窗口和Time时间
基于时间窗口计算,尤其是事件时间窗口,其中滚动Tumbling窗口和滑动Sliding窗口
State状态和Checkpoint检查点
处理数据时,使用到前面计算结果,将其存储到State中,称之为State
定期将程序中状态数据进行保存,称之为Checkpoint(程序)或Savepoint(人为)
======================================================================================
1、Window 窗口计算
1) 将流式数据划分为一批次一批次,对每批次数据进行处理分析
每批次:窗口window
对每批次数据处理称之为窗口计算
【Window 窗口时流式计算到批处理一个桥梁】
2) 核心点:
第1点:窗口分配器
WindowAssinger,将流中数据分配到Window中(如何将流中数据划分为Window窗口)
第2点:窗口函数
WindowFunction,对窗口中数据进行计算
3) Window窗口类型
第1种方式:时间窗口TimeWindow(start和end)
滚动时间窗口(翻滚时间窗口)
size = slide,流中数据仅仅被分配到1个窗口中,数据不会被重复计算
【使用最多】
滑动时间窗口
size != slide,通常size > slide,流中数据可能被分配到多个窗口中,数据被重复计算
【绝大多数场景中,不允许数据丢失计算,可以重复计算】
第2种方式:计数窗口CountWindow
滚动计数窗口和滑动计数窗口
第3种方式:会话窗口SessionWindow
基于时间会话窗口(start和end)
设置会话时间间隔gap,某个数据到达之后,超过设置时间间隔没有后续数据的到达,将前面的数据放在一个惶恐
4) Window API:2种类型
第1类:KeyedStream Window API
将数据流指定key分组,再进行窗口及思源
datastream.keyBy().window().apply/process
第2类:DataStream Window API
直接对数据流进行窗口计算
datastream.windowAll.apply/process
5) 调用WindowStream中apply转换算子,对窗口数据计算
如果是KededStream分组流设置窗口
WindowFunction 窗口函数接口,有4个泛型参数:IN,OUT,Key,Window
如果是DataStream数 据流设置窗口
AllWindowFunction 窗口函数接口,有3个泛型参数:IN,OUT,Window
2、Time 时间语义
1) 最初分为三种语义
第1种语义:EventTime 事件时间
数据产生的时间,嵌入在数据的字段中,比如订单数据的订单时间
第2种语义:InjectionTime 摄入时间
表示流式流式计算程序中数据源Source获取数据的时间
第3种语义:ProcessingTime 处理时间
表示流式计算程序处理数据的时间
2) flink 1.11版本,变为2种语义
EventTime和InjectionTime
【实际Job运行时,InjectionTime几乎与ProcessingTime一样的,所以在API中,只提供事件时间和处理时间窗口划分,到flink 新版本中,为了简化理论,直接将摄入时间去除。】
3) 事件时间语义最为关键
在实际开发中,当设置时间窗口计算时,往往几乎都是基于事件时间设置窗口计算
滚动事件时间窗口TumblingEventTimeWindow
滑动事件时间窗口SlidingEventTimeWindow
事件时间会话窗口EventTimeSessionWindow
如果是处理时间窗口,诞生出3个类型窗口
滚动处理时间窗口TumblingProcessingTimeWindow
滑动处理时间窗口SlidingProcessingTimeWindow
处理时间会话窗口EventProcessingSessionWindow
4) 如果基于事件时间窗口,设置开发时步骤
step1. 提取数据中事件时间,转换为Long类型
表示告知Job每条数据事件时间,就可以将数据划分到对应窗口中
step2. 设置窗口时,使用基于EventTime事件时间窗口
EventTimeWindow
3、Flink Window窗口计算:基于事件时间窗口时就按
在实际数据收集采集过程中,由于网络延迟等故障原因,导致数据先产生后到达,有的数据迟到很久很久,此时少数数据乱序
理想情况:
1 2 3 4 5 6 7
事件情况:
1 2 4 3 6 5 7
1) 默认方案:
当数据到达时,所在窗口已被触发计算,并且销毁掉,此时直接丢弃数据
2) 方案1:数据乱序或延迟时,依然被计算
第1种方式:Watermark 水位线机制
【让窗口计算时间,等一等,比如等待50ms,再进行计算,此时可能等待窗口中乱序数据达到】
a. 本质:
给数据流中每条数据加上时间戳timestamp,等于数据事件时间 - 允许最大乱序时间
b. 功能:
触发窗口计算,watermark-timestamp >= window-time
第2种方式:AllowedLateness
【当窗口数据触发计算以后,不要立即销毁窗口数据,保存到内存中一段时间,在时间范围内,窗口中延迟数据到达,依然触发窗口计算】
3) 方案2:迟到数据直接放入到侧边流中,后续单独处理
sideOutput
======================================================================================
阿里巴巴,自从双11以后,实时大屏统计,技术变更:
2017年之前:JStorm(Apache Storm)
|
|
2017年开始:Blink(Apache Flink)
|
|
主要原因:
Apache Flink 流式计算时,属于状态计算,并且可以将状态自动保存,便于容灾恢复
端到端精确性一次语义
======================================================================================
实时项目面试题:
[业务数据:每秒产生1800条数据,请问大数据集群规模怎么样?,如何规划呢?]
集群机器多少
每台机器配置如何(CPU CORE、内存Memory和Disk 硬盘)
======================================================================================
Flink State状态:
【Apache Flink® — Stateful Computations over Data Streams】
1. 状态是什么
State状态,指的是Job作业运行时,计算数据过程中,存储中间临时值,下一条数据处理时需要使用
比如词频统计WordCount
flink -> 1
flink |
flink -> 2 = 以前词频1 + 当前词频1 ,求和计算
2. 类型划分:
第1类:Operator State 算子状态
Flink Stream Job -> Source Operator、Transformation Operator、Sink Operator
|
所有算子操作,都可以有状态
常常作用于:Source 数据源
比如从Kafka 队列topic中消费数据,3个分区数据消费,启动3个SubTask子任务消费
每次数据消费以后,需要保存消费偏移量,以便下次继续消费
|
可以使用状态存储偏移量
【每个Operator 算子实例,存储一个状态值State】
第2类:KeyedState 键控状态
KeyedStream分组流中每个Key都有一个状态,此时称为Key对应的状态为键控主干太
比如词频统计WordCount中,每个单词都有一个状态State,存储对应的词频
3. 存储数据结构
单值存储:ValueState
存储多个值:ListState,相当于1个列表
存储KV集合:MapState,相当于Map集合映射或字典
广播状态,底层依然是map集合:BroadcastState
单值计算状态:
ReducingState、AggregatingState、FoldingState
4. 案例:KeyedState,键控状态案例
分组后,处理每组中的数据时,定义状态,保存计算中间结果值
实现功能:max算子功能,对数据流DataStream,指定分组key后,对每个组内数据获取指定字段的最大值
网友评论