Flink 学习笔记

FLINK SPI SPARK

Posted by Jurrivh on September 19, 2022

数据, 时间, 状态 是分布式计算的基石, 本文记录了学习 Flink 过程中的一些知识点

Flink篇

Flink 擅长处理无界和有界数据集, 精确的时间控制和状态化可以使 Flink 在 runtime 时运行处理任何无界流

Flink 是分布式的, 理念与分布式系统契合, 通过增加节点达到高性能和高并发, 增加副本达到高可用,

Flink 集成了常用的资源管理器: yarn, mesos, k8s, 其设计为能够很好地工作在上述每个资源管理器中,这是通过资源管理器特定(resource-manager-specific)的部署模式实现的。 Flink 可以采用与当前资源管理器相适应的方式进行交互。

有状态的 Flink 程序针对本地状态访问进行了优化。任务的状态始终保留在内存中,如果状态大小超过可用内存,则会保存在能高效访问的磁盘数据结构中

1
2
3
4
5
6
7
8
9
10
11
12
多种状态基础类型:Flink 为多种不同的数据结构提供了相对应的状态基础类型,例如原子值(value),列表(list)以及映射(map)。
开发者可以基于处理函数对状态的访问方式,选择最高效、最适合的状态基础类型。

插件化的State Backend:State Backend 负责管理应用程序状态,并在需要的时候进行 checkpoint。Flink 支持多种 state backend,
可以将状态存在内存或者 RocksDB。RocksDB 是 一种高效的嵌入式、持久化键值存储引擎。Flink 也支持插件式的自定义 state backend 进行状态存储。

精确一次语义:Flink 的 checkpoint 和故障恢复算法保证了故障发生后应用状态的一致性。因此,Flink 能够在应用程序发生故障时,对应用程序透明,
不造成正确性的影响。

超大数据量状态:Flink 能够利用其异步以及增量式的 checkpoint 算法,存储数 TB 级别的应用状态。

可弹性伸缩的应用:Flink 能够通过在更多或更少的工作节点上对状态进行重新分布,支持有状态应用的分布式的横向伸缩。

只有在每一个单独的事件上进行转换操作的应用才不需要状态,换言之,每一个具有一定复杂度的流处理应用都是有状态的。任何运 行基本业务逻辑的流处理应用都需要在一定时间内存储所接收的事件或中间结果,以供后续的某个时间点(例如收到下一个事件或者经过一段特定时间) 进行访问并进行后续处理。

1
2
3
4
5
6
7
8
9
10
事件时间模式:使用事件时间语义的流处理应用根据事件本身自带的时间戳进行结果的计算。因此,无论处理的是历史记录的事件还是实时的事件,
事件时间模式的处理总能保证结果的准确性和一致性。

Watermark 支持:Flink 引入了 watermark 的概念,用以衡量事件时间进展。Watermark 也是一种平衡处理延时和完整性的灵活机制。

迟到数据处理:当以带有 watermark 的事件时间模式处理数据流时,在计算完成之后仍会有相关数据到达。这样的事件被称为迟到事件。
Flink 提供了多种处理迟到数据的选项,例如将这些数据重定向到旁路输出(side output)或者更新之前完成计算的结果。

处理时间模式:除了事件时间模式,Flink 还支持处理时间语义。处理时间模式根据处理引擎的机器时钟触发计算,一般适用于有着严格的低延迟需求,
并且能够容忍近似结果的流处理应用。
1
2
3
4
5
6
7
8
9
10
11
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

env.setRestartStrategy();

固定延迟重启策略 Fixed Delay Restart Strategy

故障率重启策略 Failure Rate Restart Strategy

没有重启策略 No Restart Strategy

Fallback重启策略 Fallback Restart Strategy

FilterFunction, MapFunction, FlatMapFunction, SinkFunction, SourceFunction

对其中的每一个接口,Flink 同样提供了一个所谓 “rich” 的变体, RichMapFunction

rich变体接口提供 open() 和 getRuntimeContext() 函数

Flink 的时间窗口是时间对齐的, exp: 如果是 秒 级窗口, 那么第一个窗口肯定是从 00 秒开始的, 不管时间时间是多少, 都是从 00 开始对齐计算

Flink 的时间窗口是左闭右开原则, 即:包含起始元素, 不包含触发点元素

时间窗口必须要与水位线一起使用

1
2
3
4
5
6
7
8
9
滚动时间窗口
    每分钟页面浏览量
    TumblingEventTimeWindows.of(Time.minutes(1))
滑动时间窗口
    每10秒钟计算前1分钟的页面浏览量
    SlidingEventTimeWindows.of(Time.minutes(1), Time.seconds(10))
会话窗口
    每个会话的网页浏览量,其中会话之间的间隔至少为30分钟
    EventTimeSessionWindows.withGap(Time.minutes(30))