Apache Flink 的软件架构是一个分层、分布式、主从式的设计,专注于高吞吐、低延迟、Exactly-Once 状态一致性的流处理,同时统一支持批处理(作为有界流的特例)。其核心架构如下:
一、 分层 API
-
SQL & Table API (最高抽象层):
- 目标用户: 数据分析师、希望使用声明式语言的开发者。
- 功能: 提供标准的关系型 SQL 查询接口以及更灵活的 Table API(类似 LINQ / DataFrame API)。Flink 会将这些 API 调用编译优化成底层的 DataStream 或 DataSet 程序。
- 特点: 易于使用,自动优化(查询计划优化),与流批统一(同一查询语义在流和批上一致)。
-
DataStream API & DataSet API (核心编程模型层):
- 目标用户: 需要精细控制数据处理逻辑的开发者。
- 功能:
- DataStream API: 处理无界数据流的核心 API。提供丰富的算子(
map,filter,keyBy,window,join,process等)用于转换、聚合、连接、处理事件时间、管理状态等。 - DataSet API: 处理有界数据集的 API(批处理)。提供类似 MapReduce 的操作(
map,reduce,groupBy,join等),但在内存计算和优化方面更先进。
- DataStream API: 处理无界数据流的核心 API。提供丰富的算子(
- 特点: 提供细粒度控制,表达能力强,是构建复杂流处理应用的基础。Flink 1.12 开始,官方推荐优先使用 DataStream API 的 BATCH 执行模式来处理有界流,DataSet API 逐渐被取代,目标是流批 API 的统一。
-
Stateful Process Function (最低抽象层):
- 目标用户: 需要实现非常底层、定制化逻辑(如精细状态管理、复杂事件处理、自定义定时器)的开发者。
- 功能: 构建在 DataStream API 之上(如
ProcessFunction,KeyedProcessFunction,CoProcessFunction等)。提供对单个事件、状态(键控状态或算子状态)和定时器(事件时间或处理时间)的细粒度访问。 - 特点: 最灵活,但也最复杂。用于实现无法用 DataStream API 高阶算子表达的逻辑。
二、 运行时架构 (Runtime)
-
JobManager (Master):
- 核心大脑: 每个 Flink 集群至少有一个 JobManager(高可用模式下有多个 Active/Standby)。
- 主要职责:
- 作业调度: 接收用户提交的 Job Graph(作业逻辑图的并行化版本)。
- 资源管理: 向 ResourceManager 申请执行任务所需的资源(Task Slots)。
- Checkpoint 协调: 触发、协调分布式快照(Checkpoint / Savepoint)的生成,确保状态一致性。
- 故障恢复: 在 TaskManager 或 Task 失败时,重新调度任务,并从最近的 Checkpoint 恢复状态。
- 作业监控: 收集作业运行时的指标和状态。
- 内部组件:
- ResourceManager: 管理 TaskManager 的 Task Slots,负责资源分配和回收(与外部资源框架如 YARN/K8s 交互时,Flink 的 ResourceManager 会委托给外部框架的 ResourceManager)。
- Dispatcher: 提供 REST 接口接收作业提交,为每个提交的作业启动一个 JobMaster,提供 Web UI。
- JobMaster: 每个作业一个。负责单个作业的管理(调度、Checkpoint 协调、故障恢复)。是作业执行的真正协调者。
-
TaskManager (Worker / Slave):
- 执行引擎: 集群中运行一个或多个 TaskManager。
- 主要职责:
- 资源提供: 管理其上的 Task Slots。一个 Task Slot 是 TaskManager 资源(CPU、内存)的一个固定子集,用于执行一个 Task 的子任务(Subtask)。
- 任务执行: 在其 Slot 中执行由 JobManager 分配的 Task(实际的数据处理逻辑,如算子实例)。
- 状态存储: 存储和管理的算子状态(Keyed State, Operator State)。状态通常存储在堆内存/堆外内存,并持久化到 Checkpoint 存储。
- 数据交换: 与其他 TaskManager(甚至同一 TM 内的不同 Slot)上的 Task 进行网络数据传输(Shuffle)。
- 关键概念:
- Task Slot: 资源调度的单位。一个 Slot 可以运行一个 Pipeline 的多个算子(算子链)。
- 算子链: Flink 为了优化性能,会将多个算子(满足特定条件:One-to-One 连接、相同并行度、相同 Slot 共享组)融合(Chain)在一起,在同一个线程(同一个 Task)内执行,避免不必要的序列化和网络开销。这个融合后的实体就是一个 Task。每个 Task 由一个线程执行。
- Subtask: 一个算子的一个并行实例。一个 Task 可以包含一个或多个融合在一起的 Subtask。
-
客户端:
- 不是运行时的一部分,但用于准备和提交作业。
- 接收用户代码(DataStream/DataSet/SQL 程序),构建 Job Graph。
- 将 Job Graph 提交给 JobManager (Dispatcher)。
- 可以运行在用户机器或集群边缘节点上。
三、 核心机制
-
分布式执行模型:
- 用户编写的作业逻辑被转换成逻辑数据流图。
- 逻辑图被并行化(根据算子设置的并行度)成执行图。
- 执行图被拆分成多个 Task。
- Task 被 JobManager 调度到 TaskManager 的 Task Slot 中执行。
- Task 之间通过网络进行数据交换。
-
基于 Pipeline 的数据交换:
- Flink 在 Task 之间(特别是 One-to-One 或 Redistributing 连接模式)采用 Pipeline 数据交换。
- 生产者 Task 的子任务一旦产生数据,会立即推送给下游消费者 Task 的子任务(通过网络缓冲区)。
- 关键优势: 实现真正的流式处理,极低的延迟。避免了像 Spark Streaming (Micro-Batch) 那样需要等待整个微批次构建完成再传输的开销。
-
容错机制 (Checkpointing):
- 核心: 基于 Chandy-Lamport 分布式快照算法的异步屏障快照。
- 过程:
- JobManager 定期触发 Checkpoint,向所有 Source Task 注入 Checkpoint Barrier。
- Barrier 随数据流向下游算子流动。
- 算子收到 Barrier 时,会对其当前状态做快照(异步写入持久化存储,如 HDFS, S3)。
- 算子将 Barrier 传递给下游。
- 当所有算子(包括 Sink)都成功完成快照后,Checkpoint 完成。
- 恢复: 故障时,JobManager 协调所有 Task 从最近一次成功的 Checkpoint 恢复状态和重启处理。
- 保证: 提供 Exactly-Once 状态处理语义(数据源和输出端需要配合支持)。
-
状态管理:
- 键控状态: 与特定 Key 关联的状态,只能用在 KeyedStream 的算子中(如
keyBy之后)。状态按 Key 分区存储,访问范围限定为当前 Key。类型:ValueState,ListState,MapState,ReducingState,AggregatingState。 - 算子状态: 与算子并行实例绑定的状态,不与特定 Key 关联。类型:
ListState,UnionListState,BroadcastState。通常用于 Source/Sink 或需要广播状态给所有并行实例的场景。 - 状态后端: 负责状态存储、访问和 Checkpoint 持久化。常用实现:
HashMapStateBackend: 状态存储在 JVM 堆内存。速度快,但受限于内存大小。EmbeddedRocksDBStateBackend: 状态存储在本地嵌入的 RocksDB 数据库中(磁盘/SSD)。支持远超内存大小的状态,但访问速度相对慢一些。Checkpoint 时状态持久化到远程存储。
- 键控状态: 与特定 Key 关联的状态,只能用在 KeyedStream 的算子中(如
-
时间语义:
- 事件时间: 事件实际发生的时间(嵌入在数据记录中)。处理乱序事件的基础,是流处理最常用的时间语义。使用 Watermark 机制处理乱序和标记事件时间进度。
- 处理时间: 数据被算子处理时的系统时间。最简单,延迟最低,但结果不确定(依赖处理速度)。
- 摄取时间: 事件进入 Flink Source 算子的时间。是事件时间和处理时间的折中。较少使用。
-
资源管理与部署:
- Standalone Cluster: Flink 自带的集群模式。
- YARN: 将 Flink 作为 YARN 应用部署,利用 YARN 进行资源调度。
- Kubernetes: 原生支持将 Flink 部署在 K8s 上(Session 或 Application 模式)。
- Mesos: 支持但不如 YARN/K8s 主流。
- 云厂商托管服务: 如 AWS Kinesis Data Analytics for Apache Flink, Ververica Platform 等。
四、 架构优势
- 真正的流处理引擎: Pipeline 数据交换模型提供极低延迟。
- 流批统一: 单一运行时引擎处理无界流和有界数据集,API 层也在逐步统一。
- 强大的状态管理: 丰富、高效、可扩展的状态支持,是复杂流处理的基础。
- Exactly-Once 语义: 成熟的 Checkpoint 机制确保状态一致性。
- 高吞吐与低延迟: 优化的内存管理、网络栈和序列化框架。
- 弹性扩展: 通过调整算子并行度轻松扩展作业处理能力。
- 丰富的生态系统: 支持多种数据源(Kafka, File, CDC等)、数据汇(Kafka, DB, File等)、部署模式、状态后端、指标系统等。
五、 总结架构图
+------------------------------------------------------------------------------------------+
| Client |
| (Prepares & Submits Job Graph) |
+------------------------------------------------------------------------------------------+
|
| (Submits Job Graph)
v
+------------------------------------------------------------------------------------------+
| JobManager (Master) |
| +---------------------+ +---------------------+ +---------------------+ |
| | Dispatcher | | JobMaster (per job) | | ResourceManager | |
| | (REST, Starts JM) |<-->| (Scheduling, Checkpoint,| <->| (Manages Task Slots)| |
| +---------------------+ | Fault Tolerance) | +---------------------+ |
| +---------------------+ |
+------------------------------------------------------------------------------------------+
| ^ ^
| (Deploys) | (Heartbeat/| (Requests Slots)
| | Status) |
v | |
+------------------------------------------------------------------------------------------+
| TaskManager 1 (Worker) |
| +---------------------+ +---------------------+ +---------------------+ |
| | Task Slot 1 | | Task Slot 2 | | Task Slot n | |
| | [Operator Chain] | | [Operator Chain] | | [Operator Chain] | |
| | (Thread) | | (Thread) | | (Thread) | |
| +---------------------+ +---------------------+ +---------------------+ |
| | | | | | | |
| | | (Network Shuffle) | (Network Shuffle) | |
| v v v v v v |
+------------------------------------------------------------------------------------------+
| | | | | |
| +----------------+--------+----------------+ |
| | | |
| (External Data Sources) | | (External Data Sinks) |
v v v v
[Kafka, Files, Sockets...] [Kafka, DB, Files...]
理解 Flink 的分层 API、主从式运行时架构(JobManager/TaskManager/Slot)、Pipeline 数据传输、基于 Barrier 的分布式 Checkpoint 以及灵活的状态管理,是掌握其强大流处理能力的关键。
2724

被折叠的 条评论
为什么被折叠?



