Flink中的执行资源是通过任务槽定义。每个TaskManager都有一个或多个任务槽,每个任务槽可以运行一个并行任务的流水线(pipeline)。流水线由多个连续的任务组成,例如 MapFunction 的第n个并行实例和 ReduceFunction 的第n个并行实例。请注意,Flink经常同时执行连续的任务:对于流式处理程序时刻发生,但是对于批处理程序来说却是经常发生。
下图证明了这一点。考虑一个带有数据源,一个MapFunction 和 一个ReduceFunction 的程序。数据源和 MapFunction 以并行度4运行, ReduceFunction以并行度3运行。流水线由 Source-Map-Reduce 序列组成。在具有2个TaskManager(每个有3个插槽)的集群上,程序将按照下面的描述执行:

在内部,Flink通过SlotSharingGroup和 CoLocationGroup定义哪些任务可以共享一个槽(允许),哪些任务必须严格放置在同一个槽中。
在作业执行期间,JobManager 追踪分布式任务,决定何时调度下一个任务(或任务集合),并对完成的任务或执行失败的任务进行相应的处理。
JobManager 接收 JobGraph,JobGraph表示由算子(JobVertex)和中间结果(IntermediateDataSet)组成的数据流。每个算子都具有属性,如并行度和执行的代码等。另外,JobGraph还有一组附加的库,运行算子代码必需使用这些库。
JobManager 将 JobGraph 转换成 ExecutionGraph。 ExecutionGraph 是 JobGraph 的并行版本:对于每个 JobVertex,对于每个并行子任务它都包含一个 ExecutionVertex。例如并行度为100的算子会有一个 JobVertex 以及 100个 ExecutionVertices。 ExecutionVertex跟踪特定子任务的执行状态。JobVertex 中所有的 ExecutionVertices 都保存在一个 ExecutionJobVertex 中,该 ExecutionJobVertex 跟踪整个算子的状态。除了顶点之外, ExecutionGraph 还包含 IntermediateResult 和 IntermediateResultPartition。前者跟踪 IntermediateDataSet 的状态,后者追踪每个分区的状态。

每个 ExecutionGraph 都有一个与之相关的作业状态。作业状态表示作业执行的当前状态。
Flink 作业首先处于 ctreated 状态,然后切换到 running 状态,一旦所有工作完成后切换到 finished 状态。在出现故障的情况下,作业首先切换到 failing 状态,取消所有正在运行任务的地方。如果所有作业顶点已达到最终状态,并且作业不可重新启动,那么作业转换 failed 状态。如果作业可以重新启动,那么它将进入 restarting 状态。一旦作业重新启动完成后,将进入 ctreated 状态。
在用户取消作业的情况下,将进入 cancelling 状态。这也需要取消所有正在运行的任务。一旦所有正在运行的任务都达到最终状态,作业将转换到 cancelled 状态。
不同于表示全局终端状态以及触发清理工作的 finished, canceled 和 failed 状态,suspended 状态只是本地终端。本地终端的意思是作业的执行已在相应的 JobManager 上终止,但 Flink 集群的另一个 JobManager 可从持久性 HA 存储中检索作业并重新启动作业。因此,进入 suspended 状态的作业将不会完全清理。

在 ExecutionGraph 的执行过程中,每个并行任务都经历了从 ctreated 到 finished 或 failed 的多个阶段。下图说明了它们之间的状态和可能的转换。任务可以执行多次(例如在故障恢复过程中)。出于这个原因, ExecutionVertex 执行跟踪信息保存在 Execution 中。 每个 ExecutionVertex 都有一个当前的Execution,以及之前的Executions。

备注:
Flink版本:1.4原文:https://ci.apache.org/projects/flink/flink-docs-release-1.4/internals/job_scheduling.html