本文档主要探讨了Apache Flink的核心执行流程,特别是ExecutionGraph的生成及其在Flink作业调度中的作用。ExecutionGraph是Flink作业在服务器端(JobManager)生成的执行表示,它基于JobGraph进行了优化,为任务调度和执行提供基础。
在Flink的执行流程中,ExecutionGraph的生成是关键步骤。不同于在客户端生成的StreamGraph和JobGraph,ExecutionGraph在JobManager上构建,确保整个系统只有一个JobManager来协调任务。ExecutionGraph的构建主要由`ExecutionGraphBuilder.buildGraph(...)`方法完成,其中包含了大量与检查点(checkpoint)相关的逻辑,这部分内容在此被省略。核心部分在于`executionGraph.attachJobGraph(sortedTopology)`,该方法遍历jobVertex并进行处理。
1. 遍历过程中,系统会检查每个JobVertex是否是输入顶点且不可停止,如果发现这样的顶点,则设置ExecutionGraph的isStoppable属性为false。
2. 接下来,ExecutionGraph的每个节点被生成。这个过程包括:
- 分配任务信息给即将创建的图节点,并设置并行度等参数。
- 根据当前节点的下游节点数量创建IntermediateResult,这是数据在节点间传输的中间结果。
- 根据预设的并行度创建ExecutionVertex,这些顶点将负责执行实际的任务。如果作业指定了输入split,这里还会指定输入split。
在更广的上下文中,Flink的执行流程包括从简单的Hello,World WordCount程序开始,通过执行环境、算子注册,直到程序的执行。StreamGraph和JobGraph的生成是中间步骤,它们逐步转换用户定义的流处理逻辑为可执行的形式。JobGraph的生成涉及OperatorChain的逻辑,而ExecutionGraph则进一步细化了JobGraph,准备了任务调度的详细信息。
在任务调度与执行阶段,JobManager负责调度计算资源并启动job。JobManager包含多个组件,如心跳管理、任务调度器等,它在启动后会分配任务给TaskManager。TaskManager是实际执行任务的地方,它包含Task对象的生成和运行。Task对象执行时,遵循StreamTask的执行逻辑,这通常涉及到StreamOperator的处理,包括数据源、数据处理和数据输出等操作。
此外,Flink的容错机制确保了Exactly-Once语义的实现,它借鉴了其他流处理系统的经验,如Storm的RecordAcknowledgement模式、Spark Streaming的microbatch以及Google Cloud Dataflow的事务式模型。
ExecutionGraph是Flink作业执行的关键抽象,它封装了JobGraph的拓扑信息,并为任务调度和执行提供了必要的细节,确保了Flink的高效和容错特性。通过深入理解ExecutionGraph的生成和作用,我们可以更好地掌握Flink的工作原理。