Flink
字数: 0 字 时长: 0 分钟
flink 是什么?
Flink 是一个开源的流处理框架,它主要用于处理不断产生的数据流。它真正的强项是流处理能力(DataStream API
),但它也支持批处理模式(DataSet API
)。
流批处理的 API 提供了统一的编程模型(Flink 底层运行完全基于流数据,批处理可以视为处理有界数据流的特定情况),开发者可以用同一套代码处理批数据和流数据,因此 Flink 也被称为流批一体化 框架
Flink 与其他流处理框架(Spark Streaming
)区别
- Flink 提供了原生的流计算模型,支持低延迟且高吞吐量的数据处理
- FLink 采用了时间与状态概念,支持事件时间、处理时间和摄取时间,提供强大的窗口操作和状态管理能力。
- Flink 的高可用性和容错机制更为强大,通过检查点和保存点可以实现精准的一次性语义(
exactly-once semantics
) - Flink 的流处理程序动态缩扩容能力更好
什么是 Flink 的有状态流处理?
Flink 的有状态流处理指的是当数据流在处理时,算子 的状态会随着输入的数据变化而变化,并将这些状态信息保存在内存或外部存储系统中。这个状态能在不同时间点被访问并修改,从而维持计算的持续性。常用场景是会话窗口、数据聚合与累积计算等
而无状态处理指的是每条数据的处理是相互独立的,不需要依赖之前的数据或状态信息。典型的例子是过滤(filter
),每条记录的处理仅仅取决于当前记录本身。
Flink 基本架构
Flink 基本架构主要分为几个核心组件:作业管理器(JobManager
)、任务管理器(TaskManager
)、作业(Job
)和执行图(Execution Graph
)
JobManager 作业管理器
JobManager 是 Flink 的控制器,负责处理用户提交的作业,协调作业的执行、处理任务的调度、资源分配和故障恢复,主要有两个子模块
- ResourceManager
资源管理器,主要负责资源的分配和管理。所谓资源就是指 TaskManager
的任务槽 (task slots
)。任务槽是 FLink 集群中的资源调配单元,包含了机器用来执行计算的一组 CPU 和内存资源。每一个任务(Task
)都需要分配到一个 slot
上执行。
- Dispatcher
Dispatcher
任务分发器,用于处理客户端的请求,并提交作业
TaskManager 任务管理器
TaskManagr
是 Flink 的工作节点,每个节点运行一组 Task (任务),执行实际的数据处理逻辑。它负责管理本地资源,包括内存、网络、线程池等。
Job 作业
Job
是用户编写的 Flink 应用程序,包括数据流和执行逻辑。每个 Job 是一个有向无环图(DAG),节点表示操作(如 map
、filter
、window
),边表示数据流动
Flink 核心概念
算子 operator
算子是 Flink 的核心概念,它表示一个数据处理逻辑,比如:
map
:对每条数据进行转换,返回一条新的数据filter
:对数据进行过滤,返回符合条件的数据,常用于数据清洗flatMap
:将一条数据转换为多条数据,比如将句子拆分为多个单词keyBy
:对数据按照某个字段进行分组reduce
:对分组的数据进行聚合,比如计数、求和、求最大值等
算子链
算子链是 Flink 的核心优化技术,它将多个算子融合成一个 Task,在同一个线程中执行所有计算逻辑。每个 Task 会对应一个算子链, Flink 作业的并发任务数取决于算子链的数量。
当以下条件同时满足时,Flink 会自动链接算子:
- 并行度相同:算子链中的上下游算子必须拥有相同的并行度
- 一对一传输:一个子任务的输出仅供下一个算子的一个子任务消费
- 未显示禁用算子链式操作
- 算子属于同一个任务槽共享组(默认相同)
算子间使用 keyBy()
、rebalance()
等操作会导致数据重分区,算子链将断开。
为什么需要算子链
- 减少线程切换开销:多个算子在同一线程运行,避免线程间切换
- 降低序列化/网络开销:链内算子间传递数据时直接传递内存对象,无需序列化和网络传输
- 降低延迟:数据在内存内高效流转
并行度
并行度(Parallelism
)指 Flink 中数据处理的最小执行单元(子任务)的数量。
- 算子级:每个算子可以独立配置,如
map().setParallelism(4)
- 作业级:设置全局默认值
env.setParallelism(4)
- 集群级:设置 Flink 配置文件中的默认值
flink-conf.yaml::parallelism.default=4
注意
上下游算子链要求相同并行度;不同并行度的算子间数据交换需要重分区(如keyBy()
)
任务槽
任务槽(Task Slots
)是 TaskManager 的资源分配单位,每个 Slot 固定资源量(CPU
/内存
)。
时间语义
Flink 支持三种时间语义:
- 事件时间(
Event Time
):基于事件产生时间,适用于乱序事件处理(需Watermark
) - 处理时间(
Processing Time
):表示系统处理时间,适用于低延迟的场景 - 摄取时间(
Ingestion Time
):表示数据进入 Flink 时间,用于平衡精确性与延迟
水位线
水位线(Watermark
)是 Flink 用于处理乱序事件的关键机制,它表示数据流中当前时间点之前的数据。