flink工作流程
Flink的工作流程是一个从用户代码到分布式执行的完整过程,主要分为以下核心阶段(附关键流程图解):
程序提交、图转换、资源分配和任务执行四个阶段,具体流程如下:
一、程序提交阶段
代码解析
用户通过DataStream API或Table API编写程序,调用env.execute()触发执行。客户端生成初始逻辑图StreamGraph,包含所有算子节点和数据流边
图优化转换
StreamGraph:直接映射用户代码逻辑,是最接近用户层的初始图结构。
JobGraph:进行算子链(OperatorChain)合并优化,将多个算子合并为同一线程执行的任务,减少网络开销。
ExecutionGraph:加入并行度概念,是实际调度执行的数据结构,由JobMaster管理。
StreamGraph → JobGraph:合并算子链(Operator Chain),将可并行且无shuffle的算子合并为Task
// 示例:map和filter会被合并为单个Task
dataStream.map(...).filter(...).keyBy(...).sum(...)
JobGraph → ExecutionGraph:根据并行度展开为可调度的并行子任务
二、集群调度阶段
资源申请
JobManager向资源管理器(YARN/K8s)申请Slot资源
Standalone模式直接使用预分配TaskManager资源
任务部署
每个Task部署到对应Slot执行
网络通信模式:
Forward:一对一传输(如map→filter)
Hash/Partition:按Key重分布(如keyBy)
三、运行时执行阶段
数据流处理
TaskManager启动线程执行任务,采用事件驱动模型。
数据到达时触发计算,通过时间窗口和水位线机制处理乱序数据,结果可通过Sink输出或继续流转。
执行完成后,单作业模式会释放集群资源,会话模式则保留资源供其他作业使用。
关键机制:
Watermark:推动事件时间进展
Checkpoint:周期性状态快照
容错恢复
故障时从最近Checkpoint恢复状态
端到端精确一次需Sink支持两阶段提交
四、部署模式差异
模式 | 资源隔离性 | 适用场景 | 工作流特性 |
---|---|---|---|
会话模式 | 弱 | 开发测试 | 多作业共享常驻集群 |
单作业模式 | 强 | 生产环境核心作业 | 作业级集群生命周期管理 |
应用模式 | 强 | 复杂应用 | main()在集群执行,降低客户端负载 |
五、完整流程图解
Flink作业执行流程
以下为Apache Flink作业从用户代码到最终执行的完整流程示意图及说明: