引言:从批处理到流处理的演进
在大数据处理领域,Apache Flink 已经成为流处理的事实标准。与传统的批处理框架不同,Flink 采用了"流优先"的设计理念,将批处理视为流处理的特例。这种设计使得 Flink 能够同时提供低延迟的流处理和高吞吐的批处理能力。
今天,让我们深入剖析 Flink 的核心实现原理,理解其如何实现毫秒级延迟的流处理,以及如何保证 exactly-once 的处理语义。
Flink 架构概览
分层架构设计
Flink 采用了经典的分层架构设计,从下到上分为:
graph TB
A[部署层 - Local/Cluster/Cloud] --> B[运行时层 - JobManager/TaskManager]
B --> C[API层 - DataStream/DataSet/Table/SQL]
C --> D[应用层 - 用户程序]
核心组件解析
JobManager(作业管理器)
JobManager 是 Flink 集群的控制中心,负责:
- 作业调度:将作业图转换为执行图,分配任务到 TaskManager
- 资源管理:与资源管理器协调,申请和释放资源
- 检查点协调:触发和协调分布式快照,实现容错
- 故障恢复:监控任务执行状态,处理失败重启
// JobManager 核心组件示例
public class JobMaster {
private final ResourceManager resourceManager;
private final CheckpointCoordinator checkpointCoordinator;
private final SchedulerNG scheduler;
private final ExecutionGraph executionGraph;
public void submitJob(JobGraph jobGraph) {
// 1. 生成执行图
executionGraph = createExecutionGraph(jobGraph);
// 2. 申请资源
resourceManager.allocateResources(executionGraph.getResourceRequirements());
// 3. 调度执行
scheduler.scheduleForExecution(executionGraph);
// 4. 启动检查点
checkpointCoordinator.startCheckpointScheduler();
}
}TaskManager(任务管理器)
TaskManager 是实际执行任务的工作节点:
- 任务执行:运行分配的任务,处理数据流
- 内存管理:管理堆内和堆外内存,优化性能
- 网络通信:处理任务间的数据传输
- 状态管理:维护和访问本地状态后端